提交 982140e1 编写于 作者: W wizardforcel

2020-06-21 16:11:44

上级 39ace191
......@@ -14,7 +14,7 @@ Qt 是用于创建图形用户界面的领先工具包之一。 Ruby 是一种
第一个示例将显示一个工具提示。 工具提示是一个小的矩形窗口,它提供有关对象的简短信息。 它通常是一个 GUI 组件。 它是应用帮助系统的一部分。
```
```rb
#!/usr/bin/ruby
# ZetCode Ruby Qt tutorial
......@@ -52,56 +52,56 @@ app.exec
该示例创建一个窗口。 如果将鼠标指针悬停在窗口区域上方,则会弹出一个工具提示。
```
```rb
require 'Qt'
```
`require`关键字导入我们将在应用中使用的必要类型。
```
```rb
class QtApp < Qt::Widget
```
该示例继承自`Qt::Widget``Widget`类是所有用户界面对象的基类。 小部件是用户界面的原子。 它从窗口系统接收鼠标,键盘和其他事件。
```
```rb
setWindowTitle "Tooltip"
```
此方法调用为窗口创建标题。
```
```rb
setToolTip "This is Qt::Widget"
```
`setToolTip`方法为`Widget`对象创建工具提示。
```
```rb
resize 250, 150
```
在这里,我们设置窗口的宽度和高度。
```
```rb
move 300, 300
```
`move`方法在屏幕上移动窗口。
```
```rb
show
```
一切准备就绪后,我们在屏幕上显示窗口。
```
```rb
app = Qt::Application.new ARGV
QtApp.new
app.exec
......@@ -118,7 +118,7 @@ Figure: Tooltip
在第二个示例中,我们将窗口置于屏幕中央。
```
```rb
#!/usr/bin/ruby
# ZetCode Ruby Qt tutorial
......@@ -168,7 +168,7 @@ app.exec
Qt 工具包没有一种将窗口居中的方法。
```
```rb
WIDTH = 250
HEIGHT = 150
......@@ -176,14 +176,14 @@ HEIGHT = 150
这两个常数定义了应用窗口的宽度和高度。
```
```rb
qdw = Qt::DesktopWidget.new
```
`Qt::DesktopWidget`类提供有关屏幕的信息。
```
```rb
screenWidth = qdw.width
screenHeight = qdw.height
......@@ -191,7 +191,7 @@ screenHeight = qdw.height
在这里,我们确定屏幕的宽度和高度。
```
```rb
x = (screenWidth - WIDTH) / 2
y = (screenHeight - HEIGHT) / 2
......@@ -199,7 +199,7 @@ y = (screenHeight - HEIGHT) / 2
在这里,我们计算居中窗口的`x``y`坐标。 为了使窗口在屏幕上居中,我们需要知道屏幕的大小和窗口的大小。
```
```rb
move x, y
```
......@@ -210,7 +210,7 @@ move x, y
在本节的最后一个示例中,我们将创建一个退出按钮。 当我们按下此按钮时,应用终止。
```
```rb
#!/usr/bin/ruby
# ZetCode Ruby Qt tutorial
......@@ -257,21 +257,21 @@ app.exec
`Qt::PushButton`类在 Ruby Qt 中显示一个按钮。 它是一个矩形小部件,通常显示一个文本标签。
```
```rb
init_ui
```
我们将用户界面的创建委托给`init_ui`方法。
```
```rb
quit = Qt::PushButton.new 'Quit', self
```
我们创建按钮小部件。 构造函数的第一个参数是按钮显示的标签。 第二个参数是按钮的父窗口小部件。
```
```rb
quit.resize 80, 30
quit.move 50, 50
......@@ -279,7 +279,7 @@ quit.move 50, 50
我们调整和放置按钮小部件的大小。
```
```rb
connect quit, SIGNAL('clicked()'), $qApp, SLOT('quit()')
```
......
......@@ -12,7 +12,7 @@ Qt 有一些重要的内置布局管理器。 `Qt::VBoxLayout`类垂直排列小
在大多数情况下,程序员应使用布局管理器。 在某些情况下,我们可以使用绝对定位。 在绝对定位中,程序员以像素为单位指定每个小部件的位置和大小。 如果我们调整窗口大小,则小部件的大小和位置不会改变。 在各种平台上,应用看起来都不同,在 Linux 上看起来不错,在 Mac OS 上看起来不太正常。 在我们的应用中更改字体可能会破坏布局。 如果我们将应用翻译成另一种语言,则必须重做布局。 对于所有这些问题,仅在有理由时才使用绝对定位。
```
```rb
#!/usr/bin/ruby
# ZetCode Ruby Qt tutorial
......@@ -72,7 +72,7 @@ app.exec
在此示例中,我们使用绝对定位显示了三幅图像。
```
```rb
barLabel = Qt::Label.new self
barLabel.setPixmap bardejov
......@@ -80,7 +80,7 @@ barLabel.setPixmap bardejov
`Qt::Label`小部件用于保存图像。
```
```rb
barLabel.move 20, 20
```
......@@ -97,7 +97,7 @@ Figure: Absolute positioning
在下面的示例中,我们将在窗口的右下角放置两个按钮。
```
```rb
#!/usr/bin/ruby
# ZetCode Ruby Qt tutorial
......@@ -151,7 +151,7 @@ app.exec
我们使用嵌套框布局来获得我们想要的布局。
```
```rb
vbox = Qt::VBoxLayout.new self
hbox = Qt::HBoxLayout.new
......@@ -159,7 +159,7 @@ hbox = Qt::HBoxLayout.new
我们使用一个垂直框和一个水平框。
```
```rb
ok = Qt::PushButton.new "OK", self
apply = Qt::PushButton.new "Apply", self
......@@ -167,21 +167,21 @@ apply = Qt::PushButton.new "Apply", self
这是两个将进入窗口右下角的按钮。
```
```rb
hbox.addWidget ok, 1, Qt::AlignRight
```
我们将确定按钮放入水平框中。 第二个参数是`stretch`因子。 它将扩大分配给“确定”按钮的区域。 它会占用所有可用空间。 该区域内小风口的对齐方式由第三个参数控制。 `Qt::AlignRight`将按钮向右对齐。
```
```rb
vbox.addStretch 1
```
这条线创建了一个垂直扩展的白色空间,它将带有按钮的水平框推到底部。
```
```rb
vbox.addLayout hbox
```
......@@ -196,7 +196,7 @@ Figure: Buttons example
以下是嵌套框布局更复杂的示例。
```
```rb
#!/usr/bin/ruby
# ZetCode Ruby Qt tutorial
......@@ -268,21 +268,21 @@ app.exec
在此布局中,我们使用两个垂直和水平框。
```
```rb
box = Qt::VBoxLayout.new self
```
这是示例的基本布局。
```
```rb
windLabel = Qt::Label.new "Windows", self
```
首先是标签小部件。 它只是转到垂直框的顶部。
```
```rb
vbox1.addWidget activate
vbox1.addWidget close, 0, Qt::AlignTop
hbox1.addWidget edit
......@@ -294,7 +294,7 @@ vbox.addLayout hbox1
在窗口的中心部分,我们有一个文本编辑小部件和两个垂直排列的按钮。 这些按钮进入垂直框。 在此垂直框中,按钮与顶部对齐。 垂直框和文本编辑进入水平框。 该水平框转到标签窗口小部件正下方的基本垂直框。
```
```rb
hbox2.addWidget help
hbox2.addStretch 1
hbox2.addWidget ok
......@@ -305,7 +305,7 @@ vbox.addLayout hbox2, 1
帮助和确定按钮进入另一个水平框。 这两个按钮之间有一个扩大的空白区域。 同样,水平框转到基本垂直框。
```
```rb
setLayout vbox
```
......@@ -320,7 +320,7 @@ Figure: Windows example
在最后一个示例中,我们使用`Qt::GridLayout`管理器创建“新文件夹”布局示例。
```
```rb
#!/usr/bin/ruby
# ZetCode Ruby Qt tutorial
......@@ -377,28 +377,28 @@ app.exec
在我们的示例中,我们有一个标签,一行编辑,一个文本编辑和两个按钮。
```
```rb
grid = Qt::GridLayout.new self
```
我们创建`Qt::GridLayout`管理器的实例。
```
```rb
grid.addWidget nameLabel, 0, 0
```
我们将标签小部件放置在网格的第一个单元格中。 单元格从 0 开始计数。最后两个参数是行号和列号。
```
```rb
grid.addWidget nameEdit, 0, 1, 1, 3
```
线编辑窗口小部件位于第一行第二列。 最后两个参数是行跨度和列跨度。 在水平方向上,小部件将跨越三列。
```
```rb
grid.setColumnStretch 1, 1
```
......
......@@ -10,7 +10,7 @@
`Qt::CheckBox`是具有两种状态的窗口小部件:开和关。 接通状态通过复选标记显示。 它用来表示一些布尔属性。 `Qt::CheckBox`小部件提供一个带有文本标签的复选框。
```
```rb
#!/usr/bin/ruby
# ZetCode Ruby Qt tutorial
......@@ -70,28 +70,28 @@ app.exec
在我们的示例中,我们在窗口上放置了一个复选框。 复选框显示或隐藏窗口的标题。
```
```rb
setWindowTitle "Qt::CheckBox"
```
在构建窗口期间,我们为窗口设置标题。
```
```rb
cb = Qt::CheckBox.new "Show Title", self
```
`Qt::CheckBox`小部件已创建。 构造函数的第一个参数是其文本标签。 第二个参数是父窗口小部件。
```
```rb
cb.setChecked true
```
标题在应用的开始处可见。 因此,也必须选中该复选框。
```
```rb
connect cb, SIGNAL("toggled(bool)"),
self, SLOT("on_toggled(bool)")
......@@ -99,7 +99,7 @@ connect cb, SIGNAL("toggled(bool)"),
复选框的状态更改时,会发出`toggled`信号。 发出信号时,我们触发`on_toggled`方法。
```
```rb
if state
setWindowTitle "Qt::CheckBox"
else
......@@ -118,7 +118,7 @@ Figure: Qt::CheckBox
`Qt::Label`小部件用于显示文本或图像。 没有用户交互。
```
```rb
#!/usr/bin/ruby
# ZetCode Ruby Qt tutorial
......@@ -178,7 +178,7 @@ app.exec
我们的示例在窗口中显示了歌曲的歌词。
```
```rb
text = "Meet you downstairs in the bar and heard
your rolled up sleeves and your skull t-shirt
...
......@@ -187,7 +187,7 @@ your rolled up sleeves and your skull t-shirt
我们定义了多行文字。
```
```rb
label = Qt::Label.new text, self
label.setFont Qt::Font.new "Purisa", 9
......@@ -195,7 +195,7 @@ label.setFont Qt::Font.new "Purisa", 9
我们创建标签小部件并更改其字体。
```
```rb
vbox = Qt::VBoxLayout.new
vbox.addWidget label
setLayout vbox
......@@ -212,7 +212,7 @@ Figure: Qt::Label
`Qt::LineEdit`是一个小部件,允许输入和编辑单行纯文本。 `Qt::LineEdit`小部件具有撤消/重做,剪切/粘贴和拖放功能。
```
```rb
#!/usr/bin/ruby
# ZetCode Ruby Qt tutorial
......@@ -272,14 +272,14 @@ app.exec
在我们的示例中,我们显示了两个小部件。 行编辑和标签小部件。 输入到行编辑中的文本显示在标签窗口小部件中。
```
```rb
edit = Qt::LineEdit.new self
```
`Qt::LineEdit`小部件已创建。
```
```rb
connect edit, SIGNAL("textChanged(QString)"),
self, SLOT("on_changed(QString)")
......@@ -287,7 +287,7 @@ connect edit, SIGNAL("textChanged(QString)"),
当我们在行编辑中键入或删除某些文本时,将触发`on_changed`方法。
```
```rb
def on_changed text
@label.setText text
@label.adjustSize
......@@ -305,7 +305,7 @@ Figure: Qt::LineEdit widget
切换按钮是设置了可检查标志的按钮。 切换按钮是具有两种状态的按钮。 已按下但未按下。 通过单击可以在这两种状态之间切换。 在某些情况下此功能非常合适。
```
```rb
#!/usr/bin/ruby
# ZetCode Ruby Qt tutorial
......@@ -403,7 +403,7 @@ app.exec
在代码示例中,我们使用三个切换按钮来更改矩形小部件的颜色。
```
```rb
@redb = Qt::PushButton.new 'Red', self
@redb.setCheckable true
......@@ -411,14 +411,14 @@ app.exec
我们创建一个`Qt::PushButton`小部件。 `setCheckable`方法将按钮更改为切换按钮。
```
```rb
connect @redb, SIGNAL("clicked()"), SLOT("on_clicked()")
```
我们将按钮插入`on_clicked`方法调用中。
```
```rb
@square = Qt::Widget.new self
@square.setGeometry 150, 20, 100, 100
@square.setStyleSheet "QWidget { background-color: %s }" % @color.name
......@@ -429,7 +429,7 @@ connect @redb, SIGNAL("clicked()"), SLOT("on_clicked()")
`on_clicked`方法内部,我们确定颜色值并将正方形小部件更新为新颜色。
```
```rb
red = @color.red
green = @color.green
blue = @color.blue
......@@ -438,7 +438,7 @@ blue = @color.blue
在这里,我们确定方形小部件的当前颜色。
```
```rb
if @redb.isChecked
red = 255
else
......@@ -449,14 +449,14 @@ end
颜色的红色部分根据红色切换按钮的状态而改变。
```
```rb
@color = Qt::Color.new red, green, blue
```
我们创建一个新的颜色值。
```
```rb
@square.setStyleSheet("QWidget { background-color: %s }" % @color.name)
```
......@@ -471,7 +471,7 @@ Figure: Toggle buttons
`Qt::ComboBox`是一个小部件,允许用户从选项列表中进行选择。 这是一个显示当前项目的选择小部件,可以弹出可选择项目的列表。 组合框可能是可编辑的。 它以占用最少屏幕空间的方式向用户显示选项列表。
```
```rb
#!/usr/bin/ruby
# ZetCode Ruby Qt tutorial
......@@ -538,21 +538,21 @@ app.exec
在我们的代码示例中,我们有两个小部件:组合框和标签小部件。 从组合框中选择的选项显示在标签中。
```
```rb
@label = Qt::Label.new "Ubuntu", self
```
这是一个标签,它将显示组合框中当前选择的选项。
```
```rb
combo = Qt::ComboBox.new self
```
我们创建`Qt::ComboBox`小部件的实例。
```
```rb
combo.addItem "Ubuntu"
combo.addItem "Fedora"
combo.addItem "Mandriva"
......@@ -563,7 +563,7 @@ combo.addItem "Mint"
组合框将填充值。
```
```rb
connect combo, SIGNAL("activated(QString)"),
self, SLOT("on_activated(QString)")
......@@ -571,7 +571,7 @@ connect combo, SIGNAL("activated(QString)"),
当我们从组合框中选择一个选项时,将触发`on_activated`方法。
```
```rb
def on_activated text
@label.setText text
@label.adjustSize
......
......@@ -10,7 +10,7 @@
第一个示例将显示一个简单的菜单。
```
```rb
#!/usr/bin/ruby
# ZetCode Ruby Qt tutorial
......@@ -61,14 +61,14 @@ app.exec
我们有一个菜单栏,一个菜单和一个动作。 为了使用菜单,我们必须继承`MainWindow`小部件。
```
```rb
quit = Qt::Action.new "&Quit", self
```
此代码行创建一个`Action`。 每个`Menu`具有一个或多个动作对象。 注意 AND 字符(`&`)。 它为以下项目创建快捷方式: `Alt + Q` 。 它还强调了`Q`字符。 下拉菜单中的文件时,该快捷方式处于活动状态。
```
```rb
file = menuBar().addMenu "&File"
file.addAction quit
......@@ -76,7 +76,7 @@ file.addAction quit
我们创建一个`Menu`对象。 &字符创建快捷方式: `Alt + F` 。 连续的快捷键 `Alt + F``Alt + Q` 退出了应用。
```
```rb
connect(quit, SIGNAL("triggered()"),
Qt::Application.instance, SLOT("quit()"))
......@@ -92,7 +92,7 @@ Figure: Simple menu
子菜单是插入另一个菜单对象的菜单。 下一个示例对此进行了演示。
```
```rb
#!/usr/bin/ruby
# ZetCode Ruby Qt tutorial
......@@ -152,7 +152,7 @@ app.exec
在示例中,文件菜单的子菜单中有三个选项。
```
```rb
file = menuBar().addMenu "&File"
impm = Qt::Menu.new "Import"
......@@ -160,7 +160,7 @@ impm = Qt::Menu.new "Import"
我们有两个`Menu`对象。 文件菜单和导入菜单。
```
```rb
seeds = Qt::Action.new "Import news feed...", self
marks = Qt::Action.new "Import bookmarks...", self
mail = Qt::Action.new "Import mail...", self
......@@ -169,7 +169,7 @@ mail = Qt::Action.new "Import mail...", self
我们创建三个动作对象。
```
```rb
impm.addAction seeds
impm.addAction marks
impm.addAction mail
......@@ -178,7 +178,7 @@ impm.addAction mail
我们将动作对象添加到导入菜单中。
```
```rb
file.addMenu impm
```
......@@ -193,14 +193,14 @@ Figure: Submenu
在以下示例中,我们将进一步增强以前的应用。 我们将在菜单中添加图标,使用快捷方式和分隔符。 请注意,默认情况下,可能会将 Gnome 桌面配置为不显示菜单图标。 在这种情况下,我们需要在 Gnome 接口配置中启用`menu_have_icons`选项。
```
```rb
gconftool-2 --type Boolean --set /desktop/gnome/interface/menus_have_icons True
```
我们可以使用上面的命令或`gconf-editor`工具。
```
```rb
#!/usr/bin/ruby
# ZetCode Ruby Qt tutorial
......@@ -259,7 +259,7 @@ app.exec
在我们的示例中,我们有一个包含三个动作的菜单。 如果我们选择退出操作,则实际上只有退出操作才可以执行某些操作。 我们还创建了分隔符和 `Ctrl + Q` 快捷方式,它们将终止应用。
```
```rb
newpix = Qt::Icon.new "new.png"
openpix = Qt::Icon.new "open.png"
quitpix = Qt::Icon.new "exit.png"
......@@ -268,7 +268,7 @@ quitpix = Qt::Icon.new "exit.png"
这些是我们将在应用中使用的 PNG 图像。
```
```rb
newa = Qt::Action.new newpix, "&New", self
open = Qt::Action.new openpix, "&Open", self
quit = Qt::Action.new quitpix, "&Quit", self
......@@ -277,14 +277,14 @@ quit = Qt::Action.new quitpix, "&Quit", self
在这里,我们创建三个动作对象。 第一个参数是`Icon`
```
```rb
quit.setShortcut "Ctrl+Q"
```
这行创建一个快捷方式。 通过按下此快捷方式,我们将运行退出操作,这将退出应用。
```
```rb
file.addSeparator
```
......@@ -299,7 +299,7 @@ Figure: Images, shortcut and a separator
`ToolBar`类提供了一个可移动面板,其中包含一组控件,这些控件提供对应用操作的快速访问。
```
```rb
#!/usr/bin/ruby
# ZetCode Ruby Qt tutorial
......@@ -353,7 +353,7 @@ app.exec
我们创建一个带有三个动作对象和一个分隔符的工具栏。
```
```rb
newpi = Qt::Icon.new "new2.png"
openpi = Qt::Icon.new "open2.png"
quitpi = Qt::Icon.new "exit2.png"
......@@ -362,21 +362,21 @@ quitpi = Qt::Icon.new "exit2.png"
工具栏动作对象将显示这些图标。
```
```rb
toolbar = addToolBar "main toolbar"
```
`MainWindow``addToolBar`方法为应用创建一个工具栏。 文本字符串为工具栏命名。 此名称用于引用此工具栏,因为一个应用中可以有多个工具栏。 如果右键单击窗口区域,我们将看到一个可检查的选项,该选项显示或隐藏工具栏。
```
```rb
toolbar.addSeparator
```
我们创建一个垂直分隔符。
```
```rb
connect(quit, SIGNAL("triggered()"),
Qt::Application.instance, SLOT("quit()"))
......@@ -392,7 +392,7 @@ Figure: Toolbar
以下示例演示了如何停用工具栏上的工具栏按钮。 这是 GUI 编程中的常见做法。 例如,保存按钮。 如果我们将文档的所有更改都保存到磁盘上,则在大多数文本编辑器中,“保存”按钮将被停用。 这样,应用会向用户指示所有更改都已保存。
```
```rb
#!/usr/bin/ruby
# ZetCode Ruby Qt tutorial
......@@ -478,14 +478,14 @@ app.exec
在我们的示例中,我们有三个`Action`对象和一个分隔符。 在撤消或重做按钮上单击几下后,它们将被停用。 外观上,按钮显示为灰色。
```
```rb
@count = 2
```
`@count`变量确定哪个按钮被激活和禁用。
```
```rb
connect @und, SIGNAL("triggered()"), self, SLOT("count()")
connect @red, SIGNAL("triggered()"), self, SLOT("count()")
......@@ -493,14 +493,14 @@ connect @red, SIGNAL("triggered()"), self, SLOT("count()")
单击工具栏按钮,将发射`triggered`信号。 我们将此信号连接到`count`方法。
```
```rb
action = sender
```
工具栏上的两个按钮都调用`count`方法。 我们需要在它们之间说出来。 这条线确定哪个动作对象实际发出信号。
```
```rb
if "Undo" == action.text
@count = @count - 1
else
......@@ -511,7 +511,7 @@ end
撤消工具栏按钮从计数变量中减去 1。 重做添加 1.根据计数变量的值,我们启用或禁用工具栏按钮。
```
```rb
if @count <= 0
@und.setDisabled true
@red.setDisabled false
......
......@@ -10,7 +10,7 @@
消息框是方便的对话框,可向应用的用户提供消息。 该消息由文本和图像数据组成。
```
```rb
#!/usr/bin/ruby
# ZetCode Ruby Qt tutorial
......@@ -102,7 +102,7 @@ app.exec
我们使用`GridLayout`管理器来设置五个按钮的网格。 每个按钮显示一个不同的消息框。
```
```rb
if "Error" == button.text
Qt::MessageBox.critical self, "Error", "Error loading file!"
......@@ -118,7 +118,7 @@ Figure: Info dialog
`Qt::InputDialog`类提供了一个简单的便捷对话框,可从用户那里获取单个值。 输入值可以是字符串,数字或列表中的项目。 必须设置标签以告知用户他们应该输入什么。
```
```rb
#!/usr/bin/ruby
# ZetCode Ruby Qt tutorial
......@@ -186,7 +186,7 @@ app.exec
在代码示例中,我们有一个按钮和一行编辑。 该按钮显示一个输入对话框。 我们得到一些文本,文本显示在行编辑小部件中。
```
```rb
text = Qt::InputDialog.getText self, "Input Dialog",
"Enter your name"
......@@ -194,7 +194,7 @@ text = Qt::InputDialog.getText self, "Input Dialog",
`getText`静态方法创建输入对话框。 对话框中的文本存储在`text`变量中。
```
```rb
if text != nil
name = text.strip
if not name.empty?
......@@ -214,7 +214,7 @@ Figure: Input dialog
`Qt::ColorDialog`类提供一个用于指定颜色的对话框小部件。 颜色对话框的功能是允许用户选择颜色。
```
```rb
#!/usr/bin/ruby
# ZetCode Ruby Qt tutorial
......@@ -277,7 +277,7 @@ app.exec
我们在窗口中心显示一些文本。 通过单击窗口区域,我们显示一个颜色对话框。 我们将文本前景色更改为从对话框中选择的颜色。
```
```rb
def mousePressEvent event
...
end
......@@ -286,14 +286,14 @@ end
为了接收我们窗口的鼠标按下事件,我们必须重新实现`mousePressEvent`方法。
```
```rb
color = Qt::ColorDialog.getColor
```
正在创建`ColorDialog`。 所选颜色存储在`color`变量中。
```
```rb
@label.setStyleSheet "QWidget { color: %s }" % color.name
```
......@@ -308,7 +308,7 @@ Figure: Qt::ColorDialog
`Qt::FontDialog`类提供用于选择字体的对话框小部件。
```
```rb
#!/usr/bin/ruby
# ZetCode Ruby Qt tutorial
......@@ -371,14 +371,14 @@ app.exec
此示例与上一个示例相似。 这次,我们更改文本的字体。
```
```rb
font = Qt::FontDialog.getFont ok
```
正在创建`Qt::FontDialog`
```
```rb
if not ok
return
end
......@@ -387,7 +387,7 @@ end
如果单击对话框的“确定”按钮,则布尔值`ok`变量为`true`。 如果按下了取消按钮,我们将从方法中返回。
```
```rb
@label.setFont font
```
......
......@@ -12,7 +12,7 @@
在 Qt 中,我们可以使用各种图案来填充形状的内部。
```
```rb
#!/usr/bin/ruby
# ZetCode Ruby Qt tutorial
......@@ -89,7 +89,7 @@ app.exec
在代码示例中,我们将绘制九个矩形,并用不同的画笔图案填充它们。
```
```rb
def paintEvent event
painter = Qt::Painter.new self
......@@ -102,28 +102,28 @@ end
当需要重绘窗口区域时,将调用`paintEvent`方法。 当我们调整窗口大小,最大化或最小化窗口时,就会发生这种情况。在此方法中,我们创建了`Painter`对象。 该对象用于在 Qt 中进行所有绘制。 绘图本身被委托给`drawPatterns`方法。
```
```rb
painter.setPen Qt::NoPen
```
笔对象用于绘制形状的轮廓。 在我们的示例中,我们将不使用笔。
```
```rb
painter.setBrush Qt::HorPattern
```
我们将水平图案设置为画笔。
```
```rb
painter.drawRect 10, 15, 90, 60
```
我们用当前的笔和画笔绘制一个矩形。 该方法的前两个参数是 x,y 坐标。 最后两个参数是矩形的宽度和高度。
```
```rb
painter.end
```
......@@ -138,7 +138,7 @@ Figure: Patterns
Qt 绘图 API 可以绘制各种形状。 以下编程代码示例将显示其中的一些。
```
```rb
#!/usr/bin/ruby
# ZetCode Ruby Qt tutorial
......@@ -221,14 +221,14 @@ app.exec
在此代码示例中,我们在窗口上绘制了九种不同的形状。 复杂路径,饼图,和弦,圆角矩形,多边形,矩形,基于字符的形状,圆形和椭圆形。
```
```rb
painter.setRenderHint Qt::Painter::Antialiasing
```
我们在示例中使用抗锯齿。 抗锯齿形状看起来更好,但是绘制它们需要更多时间。
```
```rb
painter.setPen Qt::Color.new 150, 150, 150
painter.setBrush Qt::Brush.new Qt::Color.new 150, 150, 150
......@@ -236,7 +236,7 @@ painter.setBrush Qt::Brush.new Qt::Color.new 150, 150, 150
我们使用深灰色的笔和画笔绘制形状。
```
```rb
path1 = Qt::PainterPath.new
path1.moveTo 5, 5
......@@ -248,7 +248,7 @@ painter.drawPath path1
使用`PainterPath`对象创建第一个复杂形状。 `PainterPath`类为绘图操作提供了一个容器。 画家路径是由许多图形构造块(例如矩形,椭圆形,直线和曲线)组成的对象。
```
```rb
painter.drawPie 130, 20, 90, 60, 30*16, 120*16
painter.drawChord 240, 30, 90, 60, 0, 16*180
painter.drawRoundRect 20, 120, 80, 50
......@@ -257,7 +257,7 @@ painter.drawRoundRect 20, 120, 80, 50
这三条线绘制了一个饼图,一个和弦和一个圆角矩形。
```
```rb
points = []
points.push Qt::Point.new 130, 140
points.push Qt::Point.new 180, 170
......@@ -273,7 +273,7 @@ painter.drawPolygon polygon
我们使用五个点的数组来创建多边形。
```
```rb
baseline = Qt::PointF.new 20, 250
font = Qt::Font.new "Georgia", 55
path2 = Qt::PainterPath.new
......@@ -284,7 +284,7 @@ painter.drawPath path2
这些线创建基于字符的形状。
```
```rb
painter.drawEllipse 140, 200, 60, 60
painter.drawEllipse 240, 200, 90, 60
......@@ -302,7 +302,7 @@ Figure: Shapes
在计算机图形学中,我们可以使用 alpha 合成实现透明效果。 Alpha 合成是将图像与背景组合以创建部分透明外观的过程。 合成过程使用 Alpha 通道。 (wikipedia.org,answers.com)
```
```rb
#!/usr/bin/ruby
# ZetCode Ruby Qt tutorial
......@@ -358,14 +358,14 @@ app.exec
在示例中,我们将绘制十个具有不同透明度级别的矩形。
```
```rb
painter.setPen Qt::NoPen
```
我们不用笔。
```
```rb
for i in 1..10
painter.setBrush Qt::Brush.new Qt::Color.new 0, 0, 255, i*25
painter.drawRect 50*i, 20, 40, 40
......@@ -383,7 +383,7 @@ Figure: Transparent rectangles
在下面的示例中,我们通过旋转一堆椭圆来创建复杂的形状。
```
```rb
#!/usr/bin/ruby
# ZetCode Ruby Qt tutorial
......@@ -449,7 +449,7 @@ app.exec
在此示例中,我们创建一个甜甜圈。 形状类似于曲奇,因此得名“甜甜圈”。
```
```rb
color = Qt::Color.new
color.setNamedColor "#333333"
......@@ -457,7 +457,7 @@ color.setNamedColor "#333333"
我们可以使用十六进制表示法来创建颜色对象。
```
```rb
w = width
h = height
......@@ -465,14 +465,14 @@ h = height
在这里,我们确定窗口的宽度和高度。
```
```rb
painter.translate Qt::Point.new w/2, h/2
```
我们将坐标系移到窗口的中间。 这样,我们使绘图在数学上更容易。
```
```rb
72.times do
painter.drawEllipse -125, -40, 250, 80
painter.rotate 5.0
......@@ -490,7 +490,7 @@ Figure: Donut
在最后一个示例中,我们将在窗口上绘制文本。
```
```rb
#!/usr/bin/ruby
# ZetCode Ruby Qt tutorial
......@@ -554,14 +554,14 @@ app.exec
我们在窗口上画一首歌歌词。
```
```rb
painter.setFont Qt::Font.new "Purisa", 10
```
我们为文本设置了 Purisa 字体。
```
```rb
painter.drawText Qt::Point.new(20, 30),
"Most relationships seem so transitory"
......
......@@ -10,7 +10,7 @@
在下一个示例中,我们将创建一个自定义刻录小部件。 可以在 Nero 或 K3B 之类的应用中看到此小部件。 该小部件将从头开始创建。
```
```rb
#!/usr/bin/ruby
# ZetCode Ruby Qt tutorial
......@@ -156,14 +156,14 @@ app.exec
在这个文件中,我们创建了烧录小部件。
```
```rb
class Burning < Qt::Widget
```
自定义窗口小部件基于`Widget`小部件。
```
```rb
PANEL_HEIGHT = 30
DISTANCE = 19
LINE_WIDTH = 5
......@@ -175,7 +175,7 @@ MAX_CAPACITY = 750
这些是重要的常数。 `PANEL_HEIGHT`定义自定义窗口小部件的高度。 `DISTANCE`是比例尺上的数字与其父边框顶部之间的距离。 `LINE_WIDTH`是垂直线的宽度。 `DIVISIONS`是秤的数量。 `FULL_CAPACITY`是媒体的最大容量。 达到目标后,就会发生过度刻录。 这通过红色可视化。 `MAX_CAPACITY`是介质的最大容量。
```
```rb
@num = [ "75", "150", "225", "300",
"375", "450", "525", "600", "675" ]
......@@ -183,7 +183,7 @@ MAX_CAPACITY = 750
我们使用这些数字来构建`Burning`小部件的比例。
```
```rb
def paintEvent event
painter = Qt::Painter.new self
......@@ -196,21 +196,21 @@ end
自定义窗口小部件的图形委托给`drawWidget`方法。
```
```rb
slid_width = @parent.getCurrentWidth
```
我们使用它来获取当前选定的滑块值。
```
```rb
w = width.to_f
```
我们得到小部件的宽度。 自定义窗口小部件的宽度是动态的。 用户可以调整大小。
```
```rb
till = ((w / MAX_CAPACITY) * slid_width).to_f
full = ((w / MAX_CAPACITY) * FULL_CAPACITY).to_f
......@@ -218,7 +218,7 @@ full = ((w / MAX_CAPACITY) * FULL_CAPACITY).to_f
我们使用`w`变量进行转换。 在比例尺值和自定义小部件的度量之间。 请注意,我们使用浮点值。 我们在绘图中获得了更高的精度。
```
```rb
painter.setPen @redColor
painter.setBrush Qt::Brush.new @redColor
painter.drawRect Qt::RectF.new full+1, 0, till-full, PANEL_HEIGHT
......@@ -227,21 +227,21 @@ painter.drawRect Qt::RectF.new full+1, 0, till-full, PANEL_HEIGHT
这三行画出红色矩形,表示过度燃烧。
```
```rb
painter.drawRect 0, 0, w-1, PANEL_HEIGHT-1
```
这是小部件的外围,即外部矩形。
```
```rb
painter.drawLine Qt::LineF.new i*step, 1, i*step, LINE_WIDTH
```
在这里,我们画出小的垂直线。
```
```rb
w = metrics.width @num[i-1]
painter.drawText(Qt::PointF.new(i*step-w/2, DISTANCE), @num[i-1])
......@@ -249,7 +249,7 @@ painter.drawText(Qt::PointF.new(i*step-w/2, DISTANCE), @num[i-1])
在这里,我们绘制刻度的数字。 为了精确定位数字,我们必须获得字符串的宽度。
```
```rb
@widget = Burning.new self
hbox.addWidget @widget, 0
......@@ -257,7 +257,7 @@ hbox.addWidget @widget, 0
我们创建`Burning`小部件的实例并将其添加到水平框中。
```
```rb
def onChanged val
@cur_width = val
@widget.repaint
......@@ -267,7 +267,7 @@ end
当滑块的值更改时,我们将其存储在`@cur_width`变量中,然后重新绘制自定义窗口小部件。
```
```rb
def getCurrentWidth
return @cur_width
end
......
......@@ -12,7 +12,7 @@
`Board.rb`
```
```rb
WIDTH = 300
HEIGHT = 300
DOT_SIZE = 10
......@@ -229,7 +229,7 @@ end
`WIDTH``HEIGHT`常数确定电路板的大小。 `DOT_SIZE`是苹果的大小和蛇的点。 `ALL_DOTS`常数定义了板上可能的最大点数。 `RAND_POS`常数用于计算苹果的随机位置。 `DELAY`常数确定游戏的速度。
```
```rb
$x = [0] * ALL_DOTS
$y = [0] * ALL_DOTS
......@@ -239,7 +239,7 @@ $y = [0] * ALL_DOTS
`initGame`方法初始化变量,加载图像并启动超时功能。
```
```rb
if @inGame
drawObjects painter
else
......@@ -250,7 +250,7 @@ end
`paintEvent`方法内部,我们检查`@inGame`变量。 如果为真,则绘制对象。 苹果和蛇的关节。 否则,我们显示“游戏结束”文本。
```
```rb
def drawObjects painter
painter.drawImage @apple_x, @apple_y, @apple
......@@ -268,7 +268,7 @@ end
`drawObjects`方法绘制苹果和蛇的关节。 蛇的第一个关节是其头部,用红色圆圈表示。
```
```rb
def checkApple
if $x[0] == @apple_x and $y[0] == @apple_y
......@@ -283,7 +283,7 @@ end
`move`方法中,我们有游戏的密钥算法。 要了解它,请看一下蛇是如何运动的。 您控制蛇的头。 您可以使用光标键更改其方向。 其余关节在链上向上移动一个位置。 第二关节移动到第一个关节的位置,第三关节移动到第二个关节的位置,依此类推。
```
```rb
while z > 0
$x[z] = $x[(z - 1)]
$y[z] = $y[(z - 1)]
......@@ -294,7 +294,7 @@ end
该代码将关节向上移动。
```
```rb
if @left
$x[0] -= DOT_SIZE
end
......@@ -305,7 +305,7 @@ end
`checkCollision`方法中,我们确定蛇是否击中了自己或撞墙之一。
```
```rb
while z > 0
if z > 4 and $x[0] == $x[z] and $y[0] == $y[z]
@inGame = false
......@@ -317,7 +317,7 @@ end
如果蛇用头撞到关节之一,我们就结束游戏。
```
```rb
if $y[0] > HEIGHT
@inGame = false
end
......@@ -328,14 +328,14 @@ end
`locateApple`方法在板上随机放置一个苹果。
```
```rb
r = rand RAND_POS
```
我们得到一个从 0 到`RAND_POS-1`的随机数。
```
```rb
@apple_x = r * DOT_SIZE
...
@apple_y = r * DOT_SIZE
......@@ -344,7 +344,7 @@ r = rand RAND_POS
这些行设置了`apple`对象的 x 和 y 坐标。
```
```rb
if @inGame
checkApple
checkCollision
......@@ -359,7 +359,7 @@ end
`Board`类的`keyPressEvent`方法中,我们确定按下的键。
```
```rb
if key == Qt::Key_Left.value and not @right
@left = true
@up = false
......@@ -372,7 +372,7 @@ end
`Nibbles.rb`
```
```rb
#!/usr/bin/ruby
# ZetCode Ruby Qt tutorial
......
......@@ -10,7 +10,7 @@
`Qyoto`是一个库,提供 Qt 库与.NET 语言(如 C# 或 Visual Basic)的绑定。 Qt 是功能强大的跨平台应用开发框架。 它的母语是 C++ 。 Qyoto 是 KDE 桌面环境的一部分。
```
```vb
vbnc -r:/usr/lib/cli/qyoto-4.3/qt-dotnet.dll quitbutton.vb
```
......@@ -21,7 +21,7 @@ vbnc -r:/usr/lib/cli/qyoto-4.3/qt-dotnet.dll quitbutton.vb
第一个示例将显示一个工具提示。 工具提示是一个小的矩形窗口,它提供有关对象的简短信息。 它通常是一个 GUI 组件。 它是应用帮助系统的一部分。
```
```vb
' ZetCode Mono Visual Basic Qt tutorial
'
' This program displays
......@@ -65,14 +65,14 @@ End Class
该示例创建一个窗口。 如果将鼠标指针悬停在窗口区域上方,则会弹出一个工具提示。
```
```vb
Imports Qyoto
```
`Imports`关键字导入我们将在应用中使用的必要类型。
```
```vb
Public Class VBQApp
Inherits QWidget
......@@ -80,42 +80,42 @@ Public Class VBQApp
该示例继承自`QWidget`。 QWidget 类是所有用户界面对象的基类。 小部件是用户界面的原子。 它从窗口系统接收鼠标,键盘和其他事件。
```
```vb
Me.SetWindowTitle("Tooltip")
```
此方法调用为窗口创建标题。
```
```vb
Me.Tooltip = "This is QWidget"
```
我们通过`ToolTip`属性设置工具提示。
```
```vb
Me.Resize(250, 150)
```
在这里,我们设置窗口的宽度和高度。
```
```vb
Me.Move(300, 300)
```
`Move()`方法在屏幕上移动窗口。
```
```vb
Me.Show()
```
一切准备就绪后,我们在屏幕上显示窗口。
```
```vb
Dim qapp As New QApplication(args)
Dim app As New VBQApp
QApplication.Exec()
......@@ -132,7 +132,7 @@ Figure: Tooltip
在第二个示例中,我们将窗口置于屏幕中央。
```
```vb
' ZetCode Mono Visual Basic Qt tutorial
'
' This program centers a window
......@@ -185,7 +185,7 @@ End Class
Qyoto 没有使窗口居中的单一方法。
```
```vb
Dim WIDTH As Integer = 250
Dim HEIGHT As Integer = 150
......@@ -193,14 +193,14 @@ Dim HEIGHT As Integer = 150
这两个常数定义了应用窗口的宽度和高度。
```
```vb
Dim qdw As New QDesktopWidget
```
`QDesktopWidget`类提供有关屏幕的信息。
```
```vb
Dim screenWidth As Integer = qdw.Width()
Dim screenHeight As Integer = qdw.Height()
......@@ -208,7 +208,7 @@ Dim screenHeight As Integer = qdw.Height()
在这里,我们确定屏幕的宽度和高度。
```
```vb
Dim x As Integer = (screenWidth - WIDTH) / 2
Dim y As Integer = (screenHeight - HEIGHT) / 2
......@@ -216,7 +216,7 @@ Dim y As Integer = (screenHeight - HEIGHT) / 2
在这里,我们计算居中窗口的 x,y 坐标。 为了使窗口在屏幕上居中,我们需要知道屏幕的大小和窗口的大小。
```
```vb
Me.Move(x, y)
```
......@@ -227,7 +227,7 @@ Me.Move(x, y)
在本节的最后一个示例中,我们将创建一个退出按钮。 当我们按下此按钮时,应用终止。
```
```vb
' ZetCode Mono Visual Basic Qt tutorial
'
' This program creates a quit
......@@ -276,21 +276,21 @@ End Class
我们使用`QPushButton`。 这是一个非常常见的小部件。 它是矩形的,通常显示一个文本标签。
```
```vb
Me.InitUI()
```
我们将用户界面的创建委托给`InitUI()`方法。
```
```vb
Dim quit As New QPushButton("Quit", Me)
```
我们创建按钮小部件。 构造函数的第一个参数是标签,按钮将显示该标签。 第二个参数是按钮的父窗口小部件。
```
```vb
Connect(quit, SIGNAL("clicked()"), qApp, SLOT("quit()"))
```
......
......@@ -12,7 +12,7 @@ Qyoto 有一些重要的内置布局管理器。 `QVBoxLayout`类垂直排列小
在大多数情况下,程序员应使用布局管理器。 在某些情况下,我们可以使用绝对定位。 在绝对定位中,程序员以像素为单位指定每个小部件的位置和大小。 如果我们调整窗口大小,则小部件的大小和位置不会改变。 在各种平台上,应用看起来都不同,在 Linux 上看起来不错,在 Mac OS 上看起来不太正常。 在我们的应用中更改字体可能会破坏布局。 如果我们将您的应用翻译成另一种语言,则必须重做布局。 对于所有这些问题,仅在有理由时才使用绝对定位。
```
```vb
' ZetCode Mono Visual Basic Qt tutorial
'
' In this program, we lay out widgets
......@@ -82,7 +82,7 @@ End Class
在此示例中,我们使用绝对定位显示了三幅图像。
```
```vb
Dim barLabel As New QLabel(Me)
barLabel.SetPixmap(bardejov)
......@@ -90,7 +90,7 @@ barLabel.SetPixmap(bardejov)
`QLabel`小部件用于保存图像。
```
```vb
barLabel.SetGeometry(20, 20, 120, 90)
```
......@@ -107,7 +107,7 @@ Figure: Absolute positioning
在下面的示例中,我们将在窗口的右下角放置两个按钮。
```
```vb
' ZetCode Mono Visual Basic Qt tutorial
'
' In this program, use box layouts
......@@ -163,7 +163,7 @@ End Class
我们使用嵌套框布局来获得我们想要的布局。
```
```vb
Dim vbox As New QVBoxLayout(Me)
Dim hbox As New QHBoxLayout
......@@ -171,7 +171,7 @@ Dim hbox As New QHBoxLayout
我们使用一个垂直框和一个水平框。
```
```vb
Dim ok As New QPushButton("OK", Me)
Dim apply As New QPushButton("Apply", Me)
......@@ -179,21 +179,21 @@ Dim apply As New QPushButton("Apply", Me)
这是两个将进入窗口右下角的按钮。
```
```vb
hbox.AddWidget(ok, 1, Qt.AlignmentFlag.AlignRight)
```
我们将确定按钮放入水平框中。 第二个参数是`stretch`因子。 它将扩大分配给“确定”按钮的区域。 它会占用所有可用空间。 在此区域内,按钮向右对齐。
```
```vb
vbox.AddStretch(1)
```
这条线创建了一个垂直扩展的白色空间,它将带有按钮的水平框推到底部。
```
```vb
vbox.AddLayout(hbox)
```
......@@ -208,7 +208,7 @@ Figure: Buttons example
以下是嵌套框布局更复杂的示例。
```
```vb
' ZetCode Mono Visual Basic Qt tutorial
'
' In this program, use box layouts
......@@ -281,21 +281,21 @@ End Class
在此布局中,我们使用两个垂直和水平框。
```
```vb
Dim vbox As New QVBoxLayout(Me)
```
这是示例的基本布局。
```
```vb
vbox.AddWidget(windLabel)
```
首先是标签小部件。 它只是转到垂直框的顶部。
```
```vb
vbox1.AddWidget(activate)
vbox1.AddWidget(close, 0, AlignmentFlag.AlignTop)
hbox1.AddWidget(edit)
......@@ -307,7 +307,7 @@ vbox.AddLayout(hbox1)
在窗口的中心部分,我们有一个文本编辑小部件和两个垂直排列的按钮。 这些按钮进入垂直框。 在此垂直框中,按钮与顶部对齐。 垂直框和文本编辑进入水平框。 该水平框转到标签窗口小部件正下方的基本垂直框。
```
```vb
hbox2.AddWidget(help)
hbox2.AddStretch(1)
hbox2.AddWidget(ok)
......@@ -326,7 +326,7 @@ Figure: Windows example
在最后一个示例中,我们使用`QGridLayout`管理器创建“新文件夹”布局示例。
```
```vb
' ZetCode Mono Visual Basic Qt tutorial
'
' In this program, use the QGridLayout
......@@ -384,28 +384,28 @@ End Class
在我们的示例中,我们有一个标签,一行编辑,一个文本编辑和两个按钮。
```
```vb
Dim grid As New QGridLayout(Me)
```
我们创建`QGridLayout`管理器的实例。
```
```vb
grid.AddWidget(nameLabel, 0, 0)
```
我们将标签小部件放置在网格的第一个单元格中。 单元格从 0 开始计数。最后两个参数是行号和列号。
```
```vb
grid.AddWidget(nameEdit, 0, 1, 1, 3)
```
线编辑窗口小部件位于第一行第二列。 最后两个参数是行跨度和列跨度。 在水平方向上,小部件将跨越三列。
```
```vb
grid.SetColumnStretch(1, 1)
```
......
......@@ -10,7 +10,7 @@
`QCheckBox`是具有两种状态的窗口小部件:开和关。 开状态通过复选标记显示。 它用来表示一些布尔属性。 `QCheckBox`小部件提供一个带有文本标签的复选框。
```
```vb
' ZetCode Mono Visual Basic Qt tutorial
' This program toggles the title of the
......@@ -69,35 +69,35 @@ End Class
在我们的示例中,我们在窗口上放置了一个复选框。 复选框显示/隐藏窗口的标题。
```
```vb
Me.SetWindowTitle("QCheckBox")
```
在构建窗口期间,我们为窗口设置标题。
```
```vb
Dim cb As New QCheckBox("Show title", Me)
```
`QCheckBox`小部件已创建。 构造函数的第一个参数是其文本标签。 第二个参数是父窗口小部件。
```
```vb
cb.SetCheckState(True)
```
标题在应用的开始处可见。 因此,也必须选中该复选框。 我们使用`SetCheckState()`方法来选中该复选框。
```
```vb
Connect(cb, SIGNAL("clicked(bool)"), Me, SLOT("OnToggle(bool)"))
```
当我们单击复选框时,将发出`clicked(bool)`信号。 发出信号时,我们触发`OnToggle()`方法。
```
```vb
<Q_SLOT()> _
Private Sub OnToggle(ByVal state As Boolean)
...
......@@ -107,7 +107,7 @@ End Sub
方法定义之前带有`Q_SLOT()`属性。 此属性通知编译器有关自定义槽的信息。
```
```vb
If state
Me.SetWindowTitle("QCheckBox")
Else
......@@ -126,7 +126,7 @@ Figure: QCheckBox
`QLabel`小部件用于显示文本或图像。 没有用户交互。
```
```vb
' ZetCode Mono Visual Basic Qt tutorial
'
' This program shows lyrics on the
......@@ -192,7 +192,7 @@ End Class
我们的示例在窗口中显示了歌曲的歌词。
```
```vb
Dim text As String
text = "Meet you downstairs in the bar and heard" + vbNewLine + _
"your rolled up sleeves and your skull t-shirt" + vbNewLine + _
......@@ -202,7 +202,7 @@ text = "Meet you downstairs in the bar and heard" + vbNewLine + _
我们定义了多行文字。 与 C# ,Python 或 Ruby 不同,没有简单的结构可以用 Visual Basic 语言创建多行文本。 若要在 Visual Basic 中创建多行文本,我们使用`vbNewLine`打印常量,`+`串联字符和`_`行终止字符。
```
```vb
Dim label As New QLabel(text, Me)
label.Font = New QFont("Purisa", 9)
......@@ -210,7 +210,7 @@ label.Font = New QFont("Purisa", 9)
我们创建标签小部件并更改其字体。
```
```vb
Dim vbox As New QVBoxLayout()
vbox.AddWidget(label)
SetLayout(vbox)
......@@ -227,7 +227,7 @@ Figure: QLabel
`QLineEdit`是一个小部件,允许输入和编辑单行纯文本。 `QLineEdit`小部件具有撤消/重做,剪切/粘贴和拖放功能。
```
```vb
' ZetCode Mono Visual Basic Qt tutorial
'
' This program demonstrates the
......@@ -289,14 +289,14 @@ End Class
在我们的示例中,我们显示了两个小部件。 行编辑和标签小部件。 输入到行编辑中的文本显示在标签窗口小部件中。
```
```vb
Dim edit As New QLineEdit(Me)
```
`QLineEdit`小部件已创建。
```
```vb
Connect(edit, SIGNAL("textChanged(QString)"), Me, _
SLOT("OnChanged(QString)"))
......@@ -304,7 +304,7 @@ Connect(edit, SIGNAL("textChanged(QString)"), Me, _
当我们在行编辑中键入或删除某些文本时,将触发`OnChanged()`方法。 该方法采用字符串参数。
```
```vb
<Q_SLOT()> _
Private Sub OnChanged(ByVal text As String)
......@@ -325,7 +325,7 @@ Figure: QLineEdit widget
切换按钮是设置了可检查标志的按钮。 切换按钮是具有两种状态的按钮。 已按下但未按下。 通过单击可以在这两种状态之间切换。 在某些情况下此功能非常合适。
```
```vb
' ZetCode Mono Visual Basic Qt tutorial
'
' This program uses toggle buttons to
......@@ -429,7 +429,7 @@ End Class
在代码示例中,我们使用三个切换按钮来更改矩形小部件的颜色。
```
```vb
Dim square As QWidget
Dim color As QColor
......@@ -441,7 +441,7 @@ Dim blueb As QPushButton
我们定义了五个对象。 正方形小部件是`QWidget`,它显示颜色。 `color`变量用于保存颜色值。 这三个按钮是切换按钮,用于混合颜色值。
```
```vb
redb = New QPushButton("Red", Me)
redb.Checkable = True
......@@ -449,7 +449,7 @@ redb.Checkable = True
我们创建一个`QPushButton`小部件。 `Checkable`属性将按钮更改为切换按钮。
```
```vb
Connect(redb, SIGNAL("toggled(bool)"), Me, SLOT("OnToggled()"))
Connect(greenb, SIGNAL("toggled(bool)"), Me, SLOT("OnToggled()"))
Connect(blueb, SIGNAL("toggled(bool)"), Me, SLOT("OnToggled()"))
......@@ -458,7 +458,7 @@ Connect(blueb, SIGNAL("toggled(bool)"), Me, SLOT("OnToggled()"))
所有三个按钮都插入到一个方法调用中,即`OnToggled()`方法。
```
```vb
square = New QWidget(Me)
square.SetStyleSheet("QWidget { background-color: black }")
......@@ -468,7 +468,7 @@ square.SetStyleSheet("QWidget { background-color: black }")
`OnToggled()`方法内部,我们确定颜色值并将正方形小部件更新为新颜色。
```
```vb
Dim red As Integer = color.Red()
Dim green As Integer = color.Green()
Dim blue As Integer = color.Blue()
......@@ -477,7 +477,7 @@ Dim blue As Integer = color.Blue()
在这里,我们确定方形小部件的当前颜色。
```
```vb
If redb.Checked
red = 255
Else
......@@ -488,14 +488,14 @@ End If
根据红色切换按钮的状态,更改颜色的红色部分。
```
```vb
color = New QColor(red, green, blue)
```
我们创建一个新的颜色值。
```
```vb
Dim sheet As String = String.Format("QWidget {{ background-color: {0} }}", _
color.Name())
......@@ -503,7 +503,7 @@ Dim sheet As String = String.Format("QWidget {{ background-color: {0} }}", _
我们使用 Visual Basic 格式对象创建适当的样式表。
```
```vb
square.SetStyleSheet(sheet)
```
......@@ -518,7 +518,7 @@ Figure: Toggle buttons
`QComboBox`是一个小部件,允许用户从选项列表中进行选择。 这是一个显示当前项目的选择小部件,可以弹出可选择项目的列表。 组合框可能是可编辑的。 它以占用最少屏幕空间的方式向用户显示选项列表。
```
```vb
' ZetCode Mono Visual Basic Qt tutorial
'
' In this program, we use the QComboBox
......@@ -588,21 +588,21 @@ End Class
在我们的代码示例中,我们有两个小部件。 组合框和标签小部件。 从组合框中选择的选项显示在标签中。
```
```vb
label = New QLabel("Ubuntu", Me)
```
这是一个标签,它将显示组合框中当前选择的选项。
```
```vb
Dim combo As New QComboBox(Me)
```
我们创建`QComboBox`小部件的实例。
```
```vb
combo.AddItem("Ubuntu")
combo.AddItem("Mandriva")
combo.AddItem("Fedora")
......@@ -613,7 +613,7 @@ combo.AddItem("Gentoo")
组合框将填充值。
```
```vb
Connect(combo, SIGNAL("activated(QString)"), _
Me, SLOT("OnActivated(QString)"))
......@@ -621,7 +621,7 @@ Connect(combo, SIGNAL("activated(QString)"), _
当我们从组合框中选择一个选项时,将触发`OnActivated()`方法。
```
```vb
<Q_SLOT()> _
Private Sub OnActivated(ByVal text As String)
......
......@@ -10,7 +10,7 @@
第一个示例将显示一个简单的菜单。
```
```vb
' ZetCode Mono Visual Basic Qt tutorial
'
' This program shows a simple
......@@ -62,14 +62,14 @@ End Class
我们有一个菜单栏,一个菜单和一个动作。 为了使用菜单,我们必须继承`QMainWindow`小部件。
```
```vb
Dim quit As New QAction("&Quit", Me)
```
此代码行创建一个`QAction`。 每个`QMenu`具有一个或多个动作对象。 注意 AND 字符(`&`)。 它为以下项目创建快捷方式: `Alt + Q` 。 它还强调了`Q`字符。 下拉菜单中的文件时,该快捷方式处于活动状态。
```
```vb
Dim file As QMenu = Me.MenuBar().AddMenu("&File")
file.AddAction(quit)
......@@ -77,7 +77,7 @@ file.AddAction(quit)
我们创建一个`QMenu`对象。 &字符创建快捷方式: `Alt + F` 。 连续的快捷键 `Alt + F``Alt + Q` 退出了应用。
```
```vb
Connect(quit, SIGNAL("triggered()"), qApp, SLOT("quit()"))
```
......@@ -92,7 +92,7 @@ Figure: Simple menu
子菜单是插入另一个菜单对象的菜单。 下一个示例对此进行了演示。
```
```vb
' ZetCode Mono Visual Basic Qt tutorial
'
' This program creates
......@@ -153,7 +153,7 @@ End Class
在示例中,文件菜单的子菜单中有三个选项。
```
```vb
Dim file As QMenu = MenuBar().AddMenu("&File")
Dim impm As New QMenu("Import")
......@@ -161,7 +161,7 @@ Dim impm As New QMenu("Import")
我们有两个`QMenu`对象。 文件菜单和导入菜单。
```
```vb
Dim seeds As New QAction("Import news feed...", Me)
Dim marks As New QAction("Import bookmarks...", Me)
Dim mail As New QAction("Import mail...", Me)
......@@ -170,7 +170,7 @@ Dim mail As New QAction("Import mail...", Me)
我们创建三个动作对象。
```
```vb
impm.AddAction(seeds)
impm.AddAction(marks)
impm.AddAction(mail)
......@@ -179,7 +179,7 @@ impm.AddAction(mail)
我们将动作对象添加到导入菜单中。
```
```vb
file.AddMenu(impm)
```
......@@ -194,7 +194,7 @@ Figure: Submenu
在以下示例中,我们将进一步增强以前的应用。 我们将在菜单中添加图标,使用快捷方式和分隔符。
```
```vb
' ZetCode Mono Visual Basic Qt tutorial
'
' This program shows image
......@@ -255,7 +255,7 @@ End Class
在我们的示例中,我们有一个包含三个动作的菜单。 如果我们选择退出操作,则实际上只有退出操作才可以执行某些操作。 我们还创建了分隔符和 `Ctrl + Q` 快捷方式,它们将终止应用。
```
```vb
Dim newpix As New QIcon("new.png")
Dim openpix As New QIcon("open.png")
Dim quitpix As New QIcon("quit.png")
......@@ -264,7 +264,7 @@ Dim quitpix As New QIcon("quit.png")
这些是我们将在应用中使用的 PNG 图像。
```
```vb
Dim newa As New QAction(newpix, "&New", Me)
Dim open As New QAction(openpix, "&Open", Me)
Dim quit As New QAction(quitpix, "&Quit", Me)
......@@ -273,14 +273,14 @@ Dim quit As New QAction(quitpix, "&Quit", Me)
在这里,我们创建三个动作对象。 第一个参数是`QIcon`
```
```vb
quit.Shortcut = New QKeySequence("Ctrl+Q")
```
这行创建一个快捷方式。 通过按下此快捷方式,我们将运行退出操作,这将终止应用。
```
```vb
file.AddSeparator()
```
......@@ -295,7 +295,7 @@ Figure: Images, shortcut and a separator
`QToolBar`类提供了一个可移动面板,其中包含一组控件,这些控件提供对应用操作的快速访问。
```
```vb
' ZetCode Mono Visual Basic Qt tutorial
'
' This program creates a
......@@ -351,7 +351,7 @@ End Class
我们创建一个带有三个动作对象和一个分隔符的工具栏。
```
```vb
Dim newpi As New QIcon("new.png")
Dim openpi As New QIcon("open.png")
Dim quitpi As New QIcon("quit.png")
......@@ -360,21 +360,21 @@ Dim quitpi As New QIcon("quit.png")
工具栏动作对象将显示这些图标。
```
```vb
Dim toolbar As QToolBar = AddToolBar("main toolbar")
```
`QMainWindow`类的`AddToolBar()`方法为应用创建一个工具栏。 文本字符串为工具栏命名。 此名称用于引用此工具栏,因为一个应用中可以有多个工具栏。 如果右键单击窗口区域,我们将看到一个可检查的选项,该选项显示/隐藏工具栏。
```
```vb
toolbar.AddSeparator()
```
我们创建一个垂直分隔符。
```
```vb
Connect(quit, SIGNAL("triggered()"), qApp, SLOT("quit()"))
```
......@@ -389,7 +389,7 @@ Figure: Toolbar
以下示例演示了如何停用工具栏上的工具栏按钮。 这是 GUI 编程中的常见做法。 例如,保存按钮。 如果我们将文档的所有更改都保存到磁盘上,则在大多数文本编辑器中,“保存”按钮将被停用。 这样,应用会向用户指示所有更改都已保存。
```
```vb
' ZetCode Mono Visual Basic Qt tutorial
'
' This program disables/enables
......@@ -486,14 +486,14 @@ End Class
在我们的示例中,我们有三个`QAction`对象和一个分隔符。 在撤消或重做按钮上单击几下后,它们将被停用。 外观上,按钮显示为灰色。
```
```vb
Dim clicks As Integer = 0
```
`clicks`变量确定哪个按钮被激活或停用。
```
```vb
Connect(undoButton, SIGNAL("triggered(QAction*)"), _
Me, SLOT("Count(QAction*)"))
Connect(redoButton, SIGNAL("triggered(QAction*)"), _
......@@ -503,7 +503,7 @@ Connect(redoButton, SIGNAL("triggered(QAction*)"), _
单击工具栏按钮,将发射`triggered()`信号。 我们将此信号连接到`Count()`方法。 它接收触发它的`QAction`对象。
```
```vb
If "Undo".Equals(action.Text)
clicks -= 1
Else
......@@ -514,7 +514,7 @@ End If
撤消工具栏按钮从`clicks`变量中减去 1。 重做添加 1。根据`clicks`变量的值,我们启用/禁用工具栏按钮。
```
```vb
If clicks <= 0
undoButton.SetDisabled(True)
redoButton.SetDisabled(False)
......
......@@ -10,7 +10,7 @@
消息框是方便的对话框,可向应用的用户提供消息。 该消息由文本和图像数据组成。
```
```vb
' ZetCode Mono Visual Basic Qt tutorial
'
' This program shows
......@@ -93,14 +93,14 @@ End Class
我们使用`GridLayout`管理器来设置五个按钮的网格。 每个按钮显示一个不同的消息框。
```
```vb
Dim button As QPushButton = Sender()
```
在这里,我们确定哪个按钮称为`ShowDialog()`方法。
```
```vb
If "Error".Equals(button.Text())
QMessageBox.critical(Me, "Error", "Error loading file!")
......@@ -122,7 +122,7 @@ If "Error".Equals(button.Text())
`QInputDialog`类提供了一个简单的便捷对话框,可从用户那里获取单个值。 输入值可以是字符串,数字或列表中的项目。 必须设置标签以告知用户他们应该输入什么。
```
```vb
' ZetCode Mono Visual Basic Qt tutorial
'
' This program shows
......@@ -189,7 +189,7 @@ End Class
在代码示例中,我们有一个按钮和一行编辑。 该按钮显示一个输入对话框。 我们得到一些文本,文本显示在行编辑小部件中。
```
```vb
Dim text As String = QInputDialog.GetText( _
Me, "Input Dialog", "Enter your name")
......@@ -197,7 +197,7 @@ Dim text As String = QInputDialog.GetText( _
`GetText()`静态方法创建输入对话框。 对话框中的文本存储在`text`变量中。
```
```vb
If text <> Nothing AndAlso text.Trim() <> String.Empty
edit.SetText(text)
End If
......@@ -214,7 +214,7 @@ Figure: Input dialog
`QColorDialog`类提供用于指定颜色的对话框小部件。 颜色对话框的功能是允许用户选择颜色。
```
```vb
' ZetCode Mono Visual Basic Qt tutorial
'
' In this program, we use the
......@@ -280,7 +280,7 @@ End Class
我们在窗口中心显示一些文本。 通过单击窗口区域,我们显示一个颜色对话框。 我们将文本前景色更改为从对话框中选择的颜色。
```
```vb
Protected Overrides Sub MousePressEvent(ByVal e As QMouseEvent)
...
End Sub
......@@ -289,14 +289,14 @@ End Sub
为了接收我们窗口的鼠标按下事件,我们必须重写`MousePressEvent()`方法。
```
```vb
Dim color As QColor = QColorDialog.GetColor()
```
正在创建`QColorDialog`。 所选颜色存储在`color`变量中。
```
```vb
If Not color.IsValid() Then
Return
End If
......@@ -305,7 +305,7 @@ End If
当按下取消按钮时,我们什么也不做。
```
```vb
Dim style As String = String.Format("QWidget {{ color: {0} }}", _
color.Name())
label.SetStyleSheet(style)
......@@ -322,7 +322,7 @@ Figure: QColorDialog
`QFontDialog`类提供用于选择字体的对话框小部件。
```
```vb
' ZetCode Mono Visual Basic Qt tutorial
'
' In this program, we use the
......@@ -388,14 +388,14 @@ End Class
此示例与上一个示例相似。 这次,我们更改文本的字体。
```
```vb
Dim font As QFont = QFontDialog.GetFont(ok)
```
正在创建`QFontDialog`。 当我们按下对话框的 OK 按钮时,将设置`boolean ok`变量。
```
```vb
If Not ok Then
Return
End If
......@@ -404,7 +404,7 @@ End If
如果没有按下“确定”按钮,我们什么也不做。
```
```vb
label.Font = font
```
......
......@@ -12,7 +12,7 @@
在《京都议定书》中,我们可以使用各种图案来填充形状的内部。
```
```vb
' ZetCode Mono Visual Basic Qt tutorial
'
' This program draws nine rectangles.
......@@ -92,7 +92,7 @@ End Class
在代码示例中,我们将绘制九个矩形,并用不同的画笔图案填充它们。
```
```vb
Protected Overrides Sub PaintEvent(ByVal e As QPaintEvent)
Dim painter As New QPainter(Me)
......@@ -106,21 +106,21 @@ End Sub
当需要重绘窗口区域时,将调用`PaintEvent()`方法。 当我们调整窗口大小,最大化或最小化窗口时,就会发生这种情况。在此方法中,我们创建了`QPainter`对象。 该对象用于完成 Qyoto 中的所有绘图。 绘图本身被委托给`DrawPatterns()`方法。 `End()`方法释放绘图时使用的资源。
```
```vb
painter.SetPen(PenStyle.NoPen)
```
笔对象用于绘制形状的轮廓。 在我们的示例中,我们将不使用笔。
```
```vb
painter.SetBrush(Qt.BrushStyle.HorPattern)
```
我们将水平图案设置为画笔。 画笔用于绘制形状的内部。
```
```vb
painter.DrawRect(10, 15, 90, 60)
```
......@@ -135,7 +135,7 @@ Figure: Patterns
Qyoto 绘图 API 可以绘制各种形状。 以下编程代码示例将显示其中的一些。
```
```vb
' ZetCode Mono Visual Basic Qt tutorial
'
' This program draws basic shapes
......@@ -220,14 +220,14 @@ End Class
在此代码示例中,我们在窗口上绘制了九种不同的形状。 复杂路径,饼图,和弦,圆角矩形,多边形,矩形,基于字符的形状,圆形和椭圆形。
```
```vb
painter.SetRenderHint(QPainter.RenderHint.Antialiasing)
```
我们在示例中使用抗锯齿。 抗锯齿形状看起来更好,但是绘制它们需要更多时间。
```
```vb
painter.SetPen(New QPen(New QBrush(New QColor("Gray")), 1))
painter.SetBrush(New QBrush(New QColor("Gray")))
......@@ -235,7 +235,7 @@ painter.SetBrush(New QBrush(New QColor("Gray")))
我们使用深灰色的笔和画笔绘制形状。
```
```vb
Dim path1 As New QPainterPath()
path1.MoveTo(5, 5)
......@@ -247,7 +247,7 @@ painter.DrawPath(path1)
使用`QPainterPath`对象创建第一个复杂形状。 `QPainterPath`类为绘图操作提供了一个容器。 画家路径是由许多图形构造块(例如矩形,椭圆形,直线和曲线)组成的对象。
```
```vb
painter.DrawPie(130, 20, 90, 60, 30*16, 120*16)
painter.DrawChord(240, 30, 90, 60, 0, 16*180)
painter.DrawRoundRect(20, 120, 80, 50)
......@@ -256,7 +256,7 @@ painter.DrawRoundRect(20, 120, 80, 50)
这三行画出一个饼图,一个和弦和一个圆角矩形。
```
```vb
Dim polygon As New QPolygon(5)
polygon.SetPoint(0, 130, 140)
polygon.SetPoint(1, 180, 170)
......@@ -270,7 +270,7 @@ painter.DrawPolygon(polygon)
在这里,我们创建一个多边形。
```
```vb
Dim baseline As New QPointF(20, 250)
Dim font As New QFont("Georgia", 55)
Dim path2 As New QPainterPath()
......@@ -282,7 +282,7 @@ painter.DrawPath(path2)
这些线创建基于字符的形状。
```
```vb
painter.DrawEllipse(140, 200, 60, 60)
painter.DrawEllipse(240, 200, 90, 60)
......@@ -300,7 +300,7 @@ Figure: Shapes
在计算机图形学中,我们可以使用 alpha 合成来实现透明效果。 Alpha 合成是将图像与背景组合以创建部分透明外观的过程。 合成过程使用 Alpha 通道。 (wikipedia.org,answers.com)
```
```vb
' ZetCode Mono Visual Basic Qt tutorial
'
' This program draws ten
......@@ -358,14 +358,14 @@ End Class
在示例中,我们将绘制十个具有不同透明度级别的矩形。
```
```vb
painter.SetPen(PenStyle.NoPen)
```
我们不用笔。
```
```vb
For i As Integer = 1 To 10
painter.SetBrush(New QBrush(New QColor(0, 0, 255, i*25)))
painter.DrawRect(50*i, 20, 40, 40)
......@@ -383,7 +383,7 @@ Figure: Transparent rectangles
在下面的示例中,我们通过旋转一堆椭圆来创建复杂的形状。
```
```vb
' ZetCode Mono Visual Basic Qt tutorial
'
' This program draws a donut
......@@ -452,7 +452,7 @@ End Class
在此示例中,我们创建一个甜甜圈。 形状类似于曲奇,因此得名“甜甜圈”。
```
```vb
Dim color As New QColor()
color.SetNamedColor("#333333")
......@@ -460,7 +460,7 @@ color.SetNamedColor("#333333")
我们可以使用十六进制表示法来创建颜色对象。
```
```vb
Dim h As Integer = Me.Height()
Dim w As Integer = Me.Width()
......@@ -468,14 +468,14 @@ Dim w As Integer = Me.Width()
在这里,我们确定窗口的宽度和高度。
```
```vb
painter.Translate(New QPoint(w/2, h/2))
```
我们将坐标系移到窗口的中间。 这样,我们使绘图在数学上更容易。
```
```vb
For rot As Integer = 1 To 360 Step 5
painter.DrawEllipse(-125, -40, 250, 80)
painter.Rotate(5)
......@@ -493,7 +493,7 @@ Figure: Donut
在最后一个示例中,我们将在窗口上绘制文本。
```
```vb
' ZetCode Mono Visual Basic Qt tutorial
'
' This program draws text
......@@ -563,14 +563,14 @@ End Class
我们在窗口上画一首歌歌词。
```
```vb
painter.SetFont(New QFont("Purisa", 10))
```
我们为文本设置了 Purisa 字体。
```
```vb
painter.DrawText(New QPoint(20, 30), _
"I don't wanna do this anymore")
......
......@@ -12,7 +12,7 @@
`burning.vb`
```
```vb
Imports Qyoto
NameSpace Burning
......@@ -111,7 +111,7 @@ End Namespace
在这个文件中,我们创建了烧录小部件。
```
```vb
Public Class Burning
Inherits QWidget
......@@ -119,7 +119,7 @@ Public Class Burning
自定义窗口小部件基于`QWidget`小部件。
```
```vb
Const PANEL_HEIGHT As Integer = 30
Const DISTANCE As Integer = 19
Const LINE_WIDTH As Integer = 5
......@@ -132,7 +132,7 @@ Const MAX_CAPACITY As Double = 750.0
这些是重要的常数。 `PANEL_HEIGHT`定义自定义窗口小部件的高度。 `DISTANCE`是比例尺上的数字与其父边框顶部之间的距离。 `LINE_WIDTH`是垂直线的宽度。 `DIVISIONS`是秤的数量。 `FULL_CAPACITY`是媒体的容量。 达到目标后,就会发生过度刻录。 用红色显示。 `MAX_CAPACITY`是介质的最大容量。
```
```vb
Dim num() As String = { _
"75", "150", "225", "300", _
"375", "450", "525", "600", _
......@@ -143,7 +143,7 @@ Dim num() As String = { _
我们使用这些数字来构建烧录小部件的比例。
```
```vb
Protected Overrides Sub PaintEvent(ByVal e As QPaintEvent)
Dim painter As New QPainter(Me)
......@@ -157,28 +157,28 @@ End Sub
自定义窗口小部件的图形委托给`DrawWidget()`方法。
```
```vb
Dim burn As CustomWidget.VBQApp = CType(parent, CustomWidget.VBQApp)
```
我们检索对父窗口小部件的引用。
```
```vb
Dim slid_width As Double = burn.GetCurrentWidth()
```
我们使用它来获取当前选定的滑块值。
```
```vb
Dim width As Double = Size.Width()
```
我们得到小部件的宽度。 自定义窗口小部件的宽度是动态的。 用户可以调整大小。
```
```vb
Dim till As Double = (width / MAX_CAPACITY) * slid_width
Dim full As Double = (width / MAX_CAPACITY) * FULL_CAPACITY
......@@ -186,7 +186,7 @@ Dim full As Double = (width / MAX_CAPACITY) * FULL_CAPACITY
我们使用`width`变量进行转换。 在比例尺值和自定义小部件的度量之间。 请注意,我们使用浮点值。 我们在绘图中获得了更高的精度。
```
```vb
painter.SetPen(New QPen(New QBrush(redColor), 1))
painter.SetBrush(New QBrush(redColor))
painter.DrawRect(New QRectF(full+1, 0, till-full, PANEL_HEIGHT))
......@@ -195,21 +195,21 @@ painter.DrawRect(New QRectF(full+1, 0, till-full, PANEL_HEIGHT))
这三行画出红色矩形,表示过度燃烧。
```
```vb
painter.DrawRect(0, 0, Size.Width()-1, PANEL_HEIGHT-1)
```
这是小部件的周长。 外部矩形。
```
```vb
painter.DrawLine(New QLineF(i*move, 1, i*move, LINE_WIDTH))
```
在这里,我们画出小的垂直线。
```
```vb
Dim w As Integer = metrics.Width(num(i-1))
painter.DrawText(New QPointF(i*move-w/2, DISTANCE), num(i-1))
......@@ -220,7 +220,7 @@ painter.DrawText(New QPointF(i*move-w/2, DISTANCE), num(i-1))
`main.vb`
```
```vb
Imports Qyoto
' ZetCode Mono Visual Basic Qt tutorial
......@@ -300,7 +300,7 @@ NameSpace CustomWidget
这是主文件。 在这里,我们创建滑块小部件并使用我们的自定义小部件。
```
```vb
widget = New Burning.Burning(Me)
hbox.AddWidget(widget, 0)
......@@ -308,7 +308,7 @@ hbox.AddWidget(widget, 0)
我们创建了烧录小部件的实例,并将其添加到水平框中。
```
```vb
<Q_SLOT()> _
Public Sub ValueChanged(ByVal val As Integer)
cur_width = val
......@@ -319,7 +319,7 @@ End Sub
当滑块的值更改时,我们将其存储在`cur_width`变量中,然后重新绘制自定义窗口小部件。
```
```vb
Public Function GetCurrentWidth() As Integer
Return cur_width
End Function
......
......@@ -12,7 +12,7 @@
`board.vb`
```
```vb
Imports Qyoto
NameSpace BoardSpace
......@@ -263,7 +263,7 @@ End Namespace
`WIDTH``HEIGHT`常数确定电路板的大小。 `DOT_SIZE`是苹果的大小和蛇的点。 `ALL_DOTS`常数定义了板上可能的最大点数。 `RAND_POS`常数用于计算苹果的随机位置。 `DELAY`常数确定游戏的速度。
```
```vb
Dim x(ALL_DOTS) As Integer
Dim y(ALL_DOTS) As Integer
......@@ -273,7 +273,7 @@ Dim y(ALL_DOTS) As Integer
`InitGame()`方法初始化变量,加载图像并启动超时功能。
```
```vb
If inGame
Me.DrawObjects(painter)
Else
......@@ -284,7 +284,7 @@ End If
`PaintEvent()`方法内部,我们检查`inGame`变量。 如果为真,则绘制对象。 苹果和蛇的关节。 否则,我们显示“游戏结束”文本。
```
```vb
Private Sub DrawObjects(ByVal painter As QPainter)
painter.DrawImage(apple_x, apple_y, apple)
......@@ -303,7 +303,7 @@ End Sub
`DrawObjects()`方法绘制苹果和蛇的关节。 蛇的第一个关节是其头部,用红色圆圈表示。
```
```vb
Private Sub CheckApple()
If x(0) = apple_x And y(0) = apple_y
......@@ -321,7 +321,7 @@ End Sub
`Move()`方法中,我们有游戏的密钥算法。 要了解它,请看一下蛇是如何运动的。 您控制蛇的头。 您可以使用光标键更改其方向。 其余关节在链上向上移动一个位置。 第二关节移动到第一个关节的位置,第三关节移动到第二个关节的位置,依此类推。
```
```vb
For z As Integer = dots To 1 Step -1
x(z) = x(z - 1)
y(z) = y(z - 1)
......@@ -331,7 +331,7 @@ Next
该代码将关节向上移动。
```
```vb
If left
x(0) -= DOT_SIZE
End If
......@@ -342,7 +342,7 @@ End If
`CheckCollision()`方法中,我们确定蛇是否击中了自己或撞墙之一。
```
```vb
For z As Integer = dots To 1 Step -1
If z > 4 And x(0) = x(z) And y(0) = y(z)
inGame = False
......@@ -353,7 +353,7 @@ Next
如果蛇用头撞到关节之一,我们就结束游戏。
```
```vb
If y(0) > HEIGHT
inGame = False
End If
......@@ -364,7 +364,7 @@ End If
`LocateApple()`方法在板上随机放置一个苹果。
```
```vb
Dim rand As New Random()
Dim r As Integer = rand.Next(RAND_POS)
......@@ -373,7 +373,7 @@ Dim r As Integer = rand.Next(RAND_POS)
我们得到一个从 0 到`RAND_POS-1`的随机数。
```
```vb
apple_x = r * DOT_SIZE
...
apple_y = r * DOT_SIZE
......@@ -382,7 +382,7 @@ apple_y = r * DOT_SIZE
这些行设置了`apple`对象的 x,y 坐标。
```
```vb
If inGame
Me.CheckApple()
Me.CheckCollision()
......@@ -397,7 +397,7 @@ End If
`Board`类的`KeyPressEvent()`方法中,我们确定按下的键。
```
```vb
If key = Qt.Key.Key_Left And Not right
left = True
up = False
......@@ -410,7 +410,7 @@ End If
`nibbles.vb`
```
```vb
' ZetCode Mono Visual Basic Qt tutorial
'
' In this program, we create
......
......@@ -36,7 +36,7 @@ IronPython 是 .NET Framework 和 Mono 的 Python 编程语言的实现。 IronP
`simple.py`
```
```py
#!/usr/bin/ipy
import clr
......@@ -59,14 +59,14 @@ Application.Run(IForm())
这个小代码示例在屏幕上显示了一个简单的窗口。 它使用 Winforms 库。 它是用 IronPython 编码的。
```
```py
#!/usr/bin/ipy
```
这是 IronPython 解释器的路径。
```
```py
$ chmod +x simple.py
$ ./simple.py
......
......@@ -10,7 +10,7 @@
`simple.py`
```
```py
#!/usr/bin/ipy
import clr
......@@ -33,21 +33,21 @@ Application.Run(IForm())
此代码示例在屏幕上显示一个小窗口。
```
```py
clr.AddReference("System.Windows.Forms")
```
我们添加了 Winforms 库的参考。
```
```py
class IForm(Form):
```
在 Winforms 中,任何窗口或对话框都是`Form`。 该控件是一个基本容器,其目的是显示其他子控件。 我们的类`IForm`继承自表单。 这样,它本身就成为一种形式。
```
```py
self.Text = 'Simple'
self.Width = 250
self.Height = 200
......@@ -56,14 +56,14 @@ self.Height = 200
`Text``Width``Height`是表单的属性。 更改这些属性,我们将修改表单控件。 第一行在表单控件的标题栏中显示文本“`Simple`”。 其他两行将表单的大小设置为`250x200`像素。
```
```py
self.CenterToScreen()
```
这种方法将我们的应用集中在屏幕上。
```
```py
Application.Run(IForm())
```
......@@ -80,7 +80,7 @@ Mono 在西班牙语中意为猴子。 如果我们不为应用提供图标,
`icon.py`
```
```py
#!/usr/bin/ipy
import clr
......@@ -113,14 +113,14 @@ Application.Run(IForm())
该代码示例在窗体的左上角显示一个图标。 表单的图标是代表任务栏中表单的图片以及为表单的控制框显示的图标。
```
```py
clr.AddReference("System.Drawing")
```
`Icon`对象来自`System.Drawing`模块。 因此,我们必须添加参考。
```
```py
try:
self.Icon = Icon("web.ico")
except Exception, e:
......@@ -141,7 +141,7 @@ Figure: Icon
`tooltips.py`
```
```py
#!/usr/bin/ipy
import clr
......@@ -176,28 +176,28 @@ Application.Run(IForm())
我们的代码示例为两个控件创建一个工具提示。 `Button`控件和`Form`控件。
```
```py
tooltip = ToolTip()
```
在这里,我们创建`ToolTip`控件。 此实例用于为两个控件提供工具提示。
```
```py
tooltip.SetToolTip(self, "This is a Form")
```
在这里,我们为表单设置工具提示。
```
```py
tooltip.SetToolTip(button, "This is a Button")
```
这里是按钮。
```
```py
button = Button()
button.Parent = self
button.Text = "Button"
......@@ -217,7 +217,7 @@ Figure: Tooltips
`button.py`
```
```py
#!/usr/bin/ipy
import clr
......@@ -254,21 +254,21 @@ Application.Run(IForm())
所有 GUI 编程都是事件驱动的编程。 在我们的示例中,我们在表单容器上显示了一个按钮控件。 该按钮将收听两个事件:`Click``MouseEnter`事件。
```
```py
btn.Click += self.OnClick
```
此代码行将事件处理程序插入`Click`事件。 当我们单击按钮时,将调用`OnClick()`方法。
```
```py
btn.MouseEnter += self.OnEnter
```
当我们使用鼠标指针进入按钮区域时,将触发`MouseEnter`事件。 在这种情况下,我们的代码将调用`OnEnter()`方法。
```
```py
def OnClick(self, sender, args):
self.Close()
......@@ -276,7 +276,7 @@ def OnClick(self, sender, args):
该方法关闭应用。
```
```py
def OnEnter(self, sender, args):
print "button entered"
......
......@@ -23,7 +23,7 @@ Winforms 中的每个控件都可以具有以下`AnchorStyles`值之一:
`anchor.py`
```
```py
#!/usr/bin/ipy
import clr
......@@ -59,7 +59,7 @@ Application.Run(IForm())
这是一个非常基本的代码示例,清楚地显示了`Anchor`属性的含义。 我们在表单上有两个按钮。 第一个按钮具有默认的`AnchorStyles`值,即`AnchorStyles.Top | AnchorStyles.Left`。 第二个按钮已显式设置`AnchorStyles.Right`
```
```py
btn2.Anchor = AnchorStyles.Right
```
......@@ -93,7 +93,7 @@ Figure: Before and after resizing
`editor.py`
```
```py
#!/usr/bin/ipy
import clr
......@@ -138,7 +138,7 @@ Application.Run(IForm())
我们显示一个菜单栏和一个状态栏。 其余区域由`TextBox`控件占用。
```
```py
tb = TextBox()
tb.Parent = self
......@@ -146,7 +146,7 @@ tb.Parent = self
在这里,我们创建`TextBox`控件。 `Form`容器被设置为文本框的父级。
```
```py
tb.Dock = DockStyle.Fill
```
......@@ -163,7 +163,7 @@ Figure: Editor skeleton
`anchoredbuttons.py`
```
```py
#!/usr/bin/ipy
import clr
......@@ -222,7 +222,7 @@ Application.Run(IForm())
该示例在对话框的右下角显示“确定”,“关闭”按钮,这在对话框窗口中很常见。
```
```py
WIDTH = 250
HEIGHT = 150
......@@ -230,7 +230,7 @@ HEIGHT = 150
`WIDTH``HEIGHT`变量确定应用窗口的宽度和高度。
```
```py
BUTTONS_SPACE = 15
PANEL_SPACE = 8
CLOSE_SPACE = 10
......@@ -239,14 +239,14 @@ CLOSE_SPACE = 10
`BUTTONS_SPACE`是“确定”和“关闭”按钮之间的空间。 `PANEL_SPACE`是面板和表单底部之间的空间。 最后,`CLOSE_SPACE`变量设置“关闭”按钮和表单右边框之间的间隔。
```
```py
PANEL_HEIGHT = ok.Height + PANEL_SPACE
```
在这里,我们计算面板的高度。 面板的高度基于“确定”按钮的高度。 并且我们添加了一些额外的空间,以使按钮不会太靠近边框。
```
```py
panel = Panel()
panel.Height = PANEL_HEIGHT
panel.Dock = DockStyle.Bottom
......@@ -256,7 +256,7 @@ panel.Parent = self
在这里,我们创建和管理`Panel`控件。 在此示例中,它用作按钮的容器。 它被粘贴到表单的底部边框。 然后将按钮放置在面板内。
```
```py
ok.Text = "Ok"
ok.Parent = panel
ok.Location = Point(WIDTH-x, y)
......@@ -276,7 +276,7 @@ IronPython Mono Winforms 教程这一部分的最后一个示例显示了一个
`player.py`
```
```py
#!/usr/bin/ipy
import clr
......@@ -377,7 +377,7 @@ Application.Run(IForm())
这是一个更复杂的示例,它同时显示了`Dock``Anchor`属性。
```
```py
mainMenu = MainMenu()
filem = mainMenu.MenuItems.Add("&File")
...
......@@ -387,7 +387,7 @@ self.Menu = mainMenu
在这里,我们创建菜单栏。
```
```py
panel = Panel()
panel.Parent = self
panel.BackColor = Color.Black
......@@ -397,7 +397,7 @@ panel.Dock = DockStyle.Fill
这是黑色的面板,占据了菜单栏,状态栏和控制面板剩余的所有剩余空间。
```
```py
buttonPanel = Panel()
buttonPanel.Parent = self
buttonPanel.Height = 40
......@@ -407,7 +407,7 @@ buttonPanel.Dock = DockStyle.Bottom
这是控制面板。 它的父级是表单容器。 它被粘贴到表格的底部。 高度为 40 像素。 在此控制面板内部,我们放置了所有按钮和轨迹仪。
```
```py
pause = Button()
pause.FlatStyle = FlatStyle.Popup
pause.Parent = buttonPanel
......@@ -419,7 +419,7 @@ pause.Image = Bitmap("pause.png")
暂停按钮是具有默认`Anchor`属性值的四个按钮之一。 该按钮的样式设置为平面,因为它看起来更好。 我们在按钮上放置一个位图。
```
```py
tb.Anchor = AnchorStyles.Right
...
audio.Anchor = AnchorStyles.Right
......
......@@ -12,7 +12,7 @@
`simplemenu.py`
```
```py
#!/usr/bin/ipy
import clr
......@@ -54,21 +54,21 @@ Application.Run(IForm())
注意如何关闭应用。 我们可以使用 `Ctrl + X` 快捷方式或按 `Alt + F + E` 键关闭它 。
```
```py
ms = MenuStrip()
```
`MenuStrip`为我们的表单创建一个菜单系统。 我们将`ToolStripMenuItem`对象添加到`MenuStrip`,它们表示菜单结构中的各个菜单命令。 每个`ToolStripMenuItem`可以是您的应用的命令,也可以是其他子菜单项的父菜单。
```
```py
filem = ToolStripMenuItem("&File")
```
在这里,我们创建一个菜单。
```
```py
exit = ToolStripMenuItem("&Exit", None,
self.OnExit)
......@@ -76,28 +76,28 @@ exit = ToolStripMenuItem("&Exit", None,
此行创建退出菜单项。
```
```py
exit.ShortcutKeys = Keys.Control | Keys.X
```
我们提供了退出菜单项的快捷方式。
```
```py
filem.DropDownItems.Add(exit)
```
退出菜单项将添加到菜单对象的下拉项中。
```
```py
ms.Items.Add(filem)
```
在这里,我们将菜单对象添加到菜单栏中。
```
```py
self.MainMenuStrip = ms
```
......@@ -114,7 +114,7 @@ Figure: Simple menu
`submenu.py`
```
```py
#!/usr/bin/ipy
import clr
......@@ -171,7 +171,7 @@ Application.Run(IForm())
在此示例中,我们创建一个子菜单。 子菜单导入具有三个菜单项。
```
```py
importm = ToolStripMenuItem()
importm.Text = "Import"
......@@ -179,7 +179,7 @@ importm.Text = "Import"
`ToolStripMenuItem`可以是菜单或菜单项。 在这里它将作为子菜单。
```
```py
temp = ToolStripMenuItem()
temp.Text = "Import newsfeed list..."
importm.DropDownItems.Add(temp)
......@@ -198,7 +198,7 @@ Figure: Submenu
`checkmenuitem.py`
```
```py
#!/usr/bin/ipy
import clr
......@@ -254,21 +254,21 @@ Application.Run(IForm())
我们有两个菜单:“文件”和“查看”。 “查看”菜单具有一个菜单项,用于切换状态栏的可见性。
```
```py
mainMenu = MainMenu()
```
在此示例中,我们使用`MainMenu`控件。 要创建菜单栏,我们可以使用`MainMenu``MenuStrip`控件。 后者具有一些附加功能。
```
```py
self.viewStatusBar.Checked = True
```
默认情况下会选中此菜单项,因为状态栏从应用的开始就可见。
```
```py
check = self.viewStatusBar.Checked
if (check):
......@@ -292,7 +292,7 @@ Figure: Check menu item
`menustrip.py`
```
```py
#!/usr/bin/ipy
import clr
......@@ -346,7 +346,7 @@ Application.Run(IForm())
在代码示例中,我们有两个菜单:“文件”和“工具”。 在文件中,我们有三个带有图像的菜单项。 我们还有一个分隔符。 在此示例中,png 图像必须位于当前工作目录中。
```
```py
subm1 = ToolStripMenuItem("New")
subm1.Image = Image.FromFile("new.png")
titem1.DropDownItems.Add(subm1)
......@@ -355,7 +355,7 @@ titem1.DropDownItems.Add(subm1)
在这里,我们创建第一个菜单项。 要将图像添加到项目,我们将`Image`属性设置为图像。 我们使用`FromFile()`方法从指定的文件创建一个`Image`
```
```py
titem1.DropDownItems.Add(ToolStripSeparator())
```
......@@ -372,7 +372,7 @@ Figure: Images and separator
`toolbar.py`
```
```py
#!/usr/bin/ipy
import clr
......@@ -422,21 +422,21 @@ Application.Run(IForm())
在我们的示例中,我们在工具栏上显示了两个按钮。
```
```py
toolBar = ToolBar()
```
在这里,我们创建`ToolBar`控件。
```
```py
toolBarIcons = ImageList()
```
创建图像列表。
```
```py
save = ToolBarButton()
exit = ToolBarButton()
......@@ -444,21 +444,21 @@ exit = ToolBarButton()
这是两个工具栏按钮。
```
```py
save.ImageIndex = 0
```
我们确定图像列表中的哪个图标将用于保存工具栏按钮。
```
```py
toolBar.Buttons.AddRange((save, exit))
```
`ToolBarButton`控件已添加到工具栏。
```
```py
toolBarIcons.Images.Add(Icon("new.ico"))
toolBarIcons.Images.Add(Icon("exit.ico"))
......@@ -466,7 +466,7 @@ toolBarIcons.Images.Add(Icon("exit.ico"))
图标将添加到图像列表。
```
```py
if event.Button.Tag == "Exit":
self.Close()
......
......@@ -12,7 +12,7 @@ Winforms 控件是应用的基本构建块。 Winforms 具有广泛的各种控
`label.py`
```
```py
#!/usr/bin/ipy
import sys
......@@ -65,14 +65,14 @@ Application.Run(IForm())
在我们的示例中,我们在表单上显示了一些歌词。
```
```py
lyrics = Label()
```
`Label`控件已创建。
```
```py
text = """Meet you downstairs in the bar and heard
... """
......@@ -80,7 +80,7 @@ text = """Meet you downstairs in the bar and heard
这是我们的文字。
```
```py
font = Font("Serif", 10)
...
lyrics.Font = font
......@@ -99,7 +99,7 @@ Figure: Label
`checkbox.py`
```
```py
#!/usr/bin/ipy
import clr
......@@ -138,14 +138,14 @@ Application.Run(IForm())
我们的代码示例根据窗口的状态显示或隐藏窗口的标题。
```
```py
cb = CheckBox()
```
`CheckBox`控件已创建。
```
```py
cb.Text = "Show Title"
cb.Checked = True
......@@ -153,14 +153,14 @@ cb.Checked = True
当应用启动时,我们显示标题。 然后将`CheckBox`控件设置为选中状态。
```
```py
cb.CheckedChanged += self.OnChanged
```
当我们单击`CheckBox`控件时,将触发`CheckedChanged`事件。
```
```py
if sender.Checked:
self.Text = "CheckBox"
else:
......@@ -180,7 +180,7 @@ Figure: CheckBox
`trackbar.py`
```
```py
#!/usr/bin/ipy
import sys
......@@ -244,21 +244,21 @@ Application.Run(IForm())
在代码示例中,我们显示了`TrackBar``PictureBox`。 通过拖动轨迹栏,我们可以在`PictureBox`控件上更改图像。
```
```py
tb = TrackBar()
```
`TrackBar`控件已创建。
```
```py
tb.TickStyle = TickStyle.None
```
我们对此`TrackBar`没有显示任何报价。
```
```py
self.pb = PictureBox()
...
self.pb.Image = self.mutep
......@@ -267,7 +267,7 @@ self.pb.Image = self.mutep
`PictureBox`控件已创建。 它用于显示图像。 开始时,它会显示静音图像。
```
```py
self.mutep = Bitmap("mute.png")
self.minp = Bitmap("min.png")
self.medp = Bitmap("med.png")
......@@ -277,7 +277,7 @@ self.maxp = Bitmap("max.png")
在这里,我们将创建四个将要使用的图像。
```
```py
val = sender.Value
if val == 0:
......@@ -302,7 +302,7 @@ Figure: TrackBar
`combobox.py`
```
```py
#!/usr/bin/ipy
import clr
......@@ -348,14 +348,14 @@ Application.Run(IForm())
我们的代码编程示例显示了一个包含五个项目的组合框。 所选项目显示在标签控件中。
```
```py
cb = ComboBox()
```
`ComboBox`控件已创建。
```
```py
cb.Items.AddRange(("Ubuntu",
"Mandriva",
"Red Hat",
......@@ -366,14 +366,14 @@ cb.Items.AddRange(("Ubuntu",
`ComboBox`控件中充满了项目。
```
```py
cb.SelectionChangeCommitted += self.OnChanged
```
如果我们从组合框中选择一个项目,则会触发`SelectionChangeCommitted`事件。
```
```py
def OnChanged(self, sender, event):
self.label.Text = sender.Text
......
......@@ -10,7 +10,7 @@
`radiobutton.py`
```
```py
#!/usr/bin/ipy
import clr
......@@ -61,7 +61,7 @@ Application.Run(IForm())
在我们的示例中,我们在一个组框中显示了两个单选按钮。 一次只能选择一个选项。 选项值显示在状态栏中。
```
```py
gb = GroupBox()
gb.Text = "Sex"
......@@ -69,7 +69,7 @@ gb.Text = "Sex"
`GroupBox`控件用于将单选按钮组合在一起。 这样,我们一次只能选择一个单选按钮控件。
```
```py
male = RadioButton()
male.Text = "Male"
male.Parent = gb
......@@ -78,7 +78,7 @@ male.Parent = gb
创建带有文本“`Male`”的`RadioButton`控件。 它的父级是组框控件。
```
```py
def OnChanged(self, sender, event):
if sender.Checked:
self.statusbar.Text = sender.Text
......@@ -97,7 +97,7 @@ Figure: RadioButton
`monthcalendar.py`
```
```py
#!/usr/bin/ipy
import clr
......@@ -137,7 +137,7 @@ Application.Run(IForm())
在示例中,我们显示了`MonthCalendar``Label`
```
```py
calendar = MonthCalendar()
...
self.date = Label()
......@@ -146,7 +146,7 @@ self.date = Label()
我们有两个控件。 一个`MonthCalendar`和一个`Label`。 后者显示当前选择的日期。
```
```py
def OnSelected(self, sender, event):
dt = sender.SelectionStart
self.date.Text = str(dt.Month) + "/" + str(dt.Day) + "/" + str(dt.Year)
......@@ -165,7 +165,7 @@ Figure: MonthCalendar
`textbox.py`
```
```py
#!/usr/bin/ipy
import clr
......@@ -205,7 +205,7 @@ Application.Run(IForm())
本示例显示一个文本框和一个标签。 我们在文本框中键入的文本将立即显示在标签控件中。
```
```py
self.text = Label()
...
self.text.AutoSize = True
......@@ -214,7 +214,7 @@ self.text.AutoSize = True
`Label`控件已创建。 `AutoSize`属性确保`Label`增长以显示文本。
```
```py
tbox = TextBox()
...
tbox.KeyUp += self.OnKeyUp
......@@ -223,7 +223,7 @@ tbox.KeyUp += self.OnKeyUp
我们将`KeyUp`事件插入到`TextBox`控件中。 释放密钥时,将调用`OnKeyUp()`方法。
```
```py
def OnKeyUp(self, sender, event):
self.text.Text = sender.Text
......@@ -241,7 +241,7 @@ Figure: TextBox
`picturebox.py`
```
```py
#!/usr/bin/ipy
import sys
......@@ -279,7 +279,7 @@ Application.Run(IForm())
该示例显示了表单上的 png 图像。
```
```py
try:
castle = Bitmap('redrock.png')
except Exception, e:
......@@ -291,21 +291,21 @@ except Exception, e:
我们从当前工作目录中获得一个位图。
```
```py
pb = PictureBox()
```
`PictureBox`控件已创建。
```
```py
pb.Image = castle
```
`Image`属性指向我们创建的位图。
```
```py
self.Size = Size(castle.Width, castle.Height)
```
......
......@@ -10,7 +10,7 @@
`listbox.py`
```
```py
#!/usr/bin/ipy
import clr
......@@ -54,7 +54,7 @@ Application.Run(IForm())
我们的示例显示了一个具有六个名称的列表框。 所选项目显示在状态栏中。
```
```py
lb = ListBox()
lb.Parent = self
......@@ -62,21 +62,21 @@ lb.Parent = self
`ListBox`控件已创建。
```
```py
lb.Items.Add("Jessica")
```
这就是我们向`ListBox`控件添加新项目的方式。 该控件具有`Items`属性。 该属性是对列表框中项目列表的引用。 使用此参考,我们可以添加,删除或获取列表框中的项目数。
```
```py
lb.SelectedIndexChanged += self.OnChanged
```
当我们选择一个项目时,会触发`SelectedIndexChanged`事件。
```
```py
def OnChanged(self, sender, event):
self.sb.Text = sender.SelectedItem
......@@ -94,7 +94,7 @@ Figure: ListBox
`listview.py`
```
```py
#!/usr/bin/ipy
import clr
......@@ -169,7 +169,7 @@ Application.Run(IForm())
在我们的示例中,我们有一个包含两列的列表视图。 在第一列中,我们显示女演员的名字。 在第二个他们的出生日期。 数据存储在`List`集合中。 通过选择一行,一行中的数据将显示在状态栏中。 另外,通过单击列标题,可以对数据进行排序。
```
```py
actresses = { 'Jessica Alba' : '1981', 'Angelina Jolie' : '1975',
'Natalie Portman' : '1981', 'Rachel Weiss' : '1971',
'Scarlett Johansson' : 1984 }
......@@ -178,7 +178,7 @@ actresses = { 'Jessica Alba' : '1981', 'Angelina Jolie' : '1975',
我们将数据存储在女演员词典中。
```
```py
name = ColumnHeader()
name.Text = 'Name'
name.Width = -1
......@@ -187,7 +187,7 @@ name.Width = -1
对于列表视图中的每一列,我们创建一个`ColumnHeader`。 通过将`Width`设置为 -1,列的宽度等于列中最长的项目。
```
```py
lv = ListView()
lv.Parent = self
......@@ -195,7 +195,7 @@ lv.Parent = self
`ListView`控件已创建。
```
```py
lv.FullRowSelect = True
lv.GridLines = True
lv.AllowColumnReorder = True
......@@ -205,14 +205,14 @@ lv.Sorting = SortOrder.Ascending
在这里,我们设置控件的四个属性。 该代码行支持全行选择,显示网格线,通过拖动列对列进行重新排序并以升序对数据进行排序。
```
```py
lv.Columns.AddRange((name, year))
```
在这里,我们将两个`ColumnHeader`添加到`ListView`控件中。
```
```py
for act in actresses.keys():
item = ListViewItem()
item.Text = act
......@@ -223,14 +223,14 @@ for act in actresses.keys():
此循环填充列表视图控件。 每行作为`ListViewItem`类添加到列表视图。
```
```py
lv.View = View.Details
```
`ListView`控件可以具有不同的视图。 不同的视图以不同的方式显示数据。
```
```py
name = sender.SelectedItems[0].SubItems[0].Text
born = sender.SelectedItems[0].SubItems[1].Text
self.sb.Text = name + ', ' + born
......@@ -239,7 +239,7 @@ self.sb.Text = name + ', ' + born
`OnChanged()`方法内部,我们从选定的行中获取数据并将其显示在状态栏上。
```
```py
if sender.Sorting == SortOrder.Ascending:
sender.Sorting = SortOrder.Descending
else:
......@@ -259,7 +259,7 @@ Figure: ListView
`treeview.py`
```
```py
#!/usr/bin/ipy
import clr
......@@ -311,14 +311,14 @@ Application.Run(IForm())
这是`TreeView`控件的非常简单的演示。 我们有一个根项目和三个子项。
```
```py
tv = TreeView()
```
我们创建`TreeView`控件。
```
```py
root = TreeNode()
root.Text = 'Languages'
...
......@@ -328,7 +328,7 @@ tv.Nodes.Add(root)
在这里,我们创建一个根节点。
```
```py
child1 = TreeNode()
child1.Text = 'Python'
......@@ -336,7 +336,7 @@ child1.Text = 'Python'
子节点以类似的方式创建。
```
```py
root.Nodes.AddRange((child1, child2, child3))
```
......@@ -353,7 +353,7 @@ Figure: TreeView
`directories.py`
```
```py
#!/usr/bin/ipy
import clr
......@@ -464,21 +464,21 @@ Application.Run(IForm())
我们的代码示例在`TreeView`控件中显示指定主目录的目录。 该应用启动有些延迟,因为它首先读取主目录的目录结构。 表单上还有四个按钮。 这些按钮以编程方式展开和折叠节点。
```
```py
self.tv.Scrollable = True
```
我们使`TreeView`控件可滚动,因为该控件显示了大量目录。
```
```py
self.ShowDirectories(self.tv.Nodes, HOME_DIR)
```
`ShowDirectories()`方法使用指定主目录中可用的目录填充`TreeView`控件的节点。
```
```py
if (subDirs.Length > 0):
...
......@@ -486,7 +486,7 @@ if (subDirs.Length > 0):
我们检查是否有任何子目录。
```
```py
for dr in subDirs:
if not dr.Name.StartsWith("."):
self.ShowDirectories(tr.Nodes, dr.FullName)
......@@ -495,14 +495,14 @@ for dr in subDirs:
我们遍历所有目录。 为此,我们使用了递归算法。 我们还跳过隐藏的目录。 它们以 Unix 系统上的点开头。
```
```py
trvNode.Add(tr)
```
此代码行实际上将目录添加到`TreeView`控件。
```
```py
def OnExpand(self, sender, event):
self.tv.SelectedNode.Expand()
......
......@@ -14,7 +14,7 @@
`folderbrowserdialog.py`
```
```py
#!/usr/bin/ipy
import clr
......@@ -54,14 +54,14 @@ Application.Run(IForm())
我们有一个工具栏和一个工具栏按钮。 点击按钮,`FolderBrowserDialog`出现在屏幕上。 所选文件夹的名称显示在状态栏中。
```
```py
dialog = FolderBrowserDialog()
```
`FolderBrowserDialog`已创建。
```
```py
if (dialog.ShowDialog(self) == DialogResult.OK):
self.statusbar.Text = dialog.SelectedPath
......@@ -79,7 +79,7 @@ Figure: FolderBrowserDialog
`colordialog.py`
```
```py
#!/usr/bin/ipy
import sys
......@@ -140,21 +140,21 @@ Application.Run(IForm())
在此代码示例中,我们使用`ColorDialog`为位于窗体控件中间的矩形选择颜色。
```
```py
self.color = Color.Blue
```
开始时,矩形的颜色是蓝色。 我们使用`self.color`变量来确定矩形的颜色。
```
```py
dialog = ColorDialog()
```
`ColorDialog`已创建。
```
```py
if (dialog.ShowDialog(self) == DialogResult.OK):
self.color = dialog.Color
self.Invalidate()
......@@ -173,7 +173,7 @@ Figure: ColorDialog
`fontdialog.py`
```
```py
#!/usr/bin/ipy
import clr
......@@ -228,14 +228,14 @@ Application.Run(IForm())
我们在表单控件的中间绘制一些文本。 我们使用字体对话框更改此文本的字体。
```
```py
dialog = FontDialog()
```
`FontDialog`已创建。
```
```py
if (dialog.ShowDialog(self) == DialogResult.OK):
self.text.Font = dialog.Font
self.LocateText()
......@@ -254,7 +254,7 @@ Figure: FontDialog
`opendialog.py`
```
```py
#!/usr/bin/ipy
import clr
......@@ -303,21 +303,21 @@ Application.Run(IForm())
我们使用`OpenDialog`控件打开 C# 源文件。 我们有一个`TextBox`控件,用于显示文件。
```
```py
dialog = OpenFileDialog()
```
`OpenDialog`已创建。
```
```py
dialog.Filter = "C# files (*.cs)|*.cs"
```
我们将`Filter`属性设置为 C# 源文件。 此对话框实例只能选择 C# 文件。
```
```py
if dialog.ShowDialog(self) == DialogResult.OK:
f = open(dialog.FileName)
data = f.read()
......
......@@ -14,7 +14,7 @@ IronPython Mono Winforms 教程的这一部分将专门用于拖放操作。
`dragbutton.py`
```
```py
#!/usr/bin/ipy
import clr
......@@ -64,7 +64,7 @@ Application.Run(IForm())
我们的示例中有一些支持变量。 `isDragging`变量告诉我们是否正在拖动对象。 `oldX``oldY`变量在拖动过程开始之前存储 x,y 坐标。
```
```py
button.MouseDown += self.OnMousDown
button.MouseUp += self.OnMousUp
button.MouseMove += self.OnMousMove
......@@ -73,7 +73,7 @@ button.MouseMove += self.OnMousMove
我们为按钮插入了三种不同的鼠标处理程序。 它们实现了拖放过程的三个不同阶段。 当我们单击按钮时,过程开始。 这由`OnMousDown()`方法处理。 第二部分是机芯。 这是当我们将对象移动到新位置时。 它以`OnMousMove()`方法处理。 最后一部分是过程停止的时间。 当我们释放鼠标按钮时会发生这种情况。 适当的任务委托给`OnMousUp()`方法。
```
```py
def OnMousDown(self, sender, event):
self.isDragging = True
......@@ -84,7 +84,7 @@ self.oldY = event.Y
`OnMousDown()`方法实现了过程的第一部分。 它设置了三个必要的变量。
```
```py
def OnMousMove(self, sender, event):
if self.isDragging:
......@@ -107,7 +107,7 @@ Figure: Dragging a button
`dragtext.py`
```
```py
#!/usr/bin/ipy
import clr
......@@ -158,14 +158,14 @@ Application.Run(IForm())
我们在表单上有两个控件。 一个按钮和一个文本框。 我们将文本从文本框中拖放到按钮上。
```
```py
self.AllowDrop = True
```
我们将`AllowDrop`属性设置为`true`。 默认情况下不启用删除。
```
```py
button.DragDrop += self.OnDragDrop
button.DragEnter += self.OnDragEnter
...
......@@ -175,7 +175,7 @@ extBox.MouseDown += self.OnMousDown
同样,拖放过程分为三个步骤。 对于每个特定步骤,我们有三种方法。
```
```py
def OnMousDown(self, sender, event):
sender.SelectAll()
sender.DoDragDrop(sender.Text, DragDropEffects.Copy)
......@@ -184,7 +184,7 @@ def OnMousDown(self, sender, event):
`OnMousDown()`方法中,我们初始化了拖放过程。 我们使用`DoDragDrop()`方法启动该过程。 `DragDropEffects.Copy`参数指定操作的类型。 实质上,我们可以在拖放操作期间复制文本或移动文本。
```
```py
def OnDragEnter(self, sender, event):
if event.Data.GetDataPresent(DataFormats.Text):
......@@ -194,7 +194,7 @@ def OnDragEnter(self, sender, event):
当鼠标指针进入放置目标控件的区域时,将启动`DragEnter`事件。 必须设置`Effect`属性。 拖动源和放置目标的`DragDropEffects`必须相等。 否则,该操作将无法进行。
```
```py
def OnDragDrop(self, sender, event):
sender.Text = event.Data.GetData(DataFormats.Text)
......@@ -212,7 +212,7 @@ Figure: Drag & drop of text
`dragimage.py`
```
```py
#!/usr/bin/ipy
import sys
......@@ -289,14 +289,14 @@ Application.Run(IForm())
在我们的示例中,我们有一个`PictureBox`,并绘制了一个灰色矩形。 如果将图片放在矩形内,则矩形的颜色变为金色。
```
```py
self.brush = Brushes.Gray
```
`self.brush`变量保存矩形的笔刷。 默认情况下为灰色。
```
```py
def loadImage(self):
try:
self.image = Bitmap("image.jpg")
......@@ -309,7 +309,7 @@ def loadImage(self):
`loadImage()`方法为`PictureBox`控件加载位图。
```
```py
if self.dropRect.Contains(sender.Bounds):
self.brush = Brushes.Gold
else:
......@@ -319,7 +319,7 @@ else:
`OnMousUp()`方法中,我们确定矩形的笔刷。 如果图片框的边界在矩形内,则画笔为金色;否则,画笔为金色。 否则为灰色。
```
```py
self.Refresh()
```
......
......@@ -12,7 +12,7 @@
`lines.py`
```
```py
#!/usr/bin/ipy
import clr
......@@ -63,28 +63,28 @@ Application.Run(IForm())
我们在表格上画了五行。 每行具有不同的`DashStyle`
```
```py
self.Paint += self.OnPaint
```
绘图事件将传递给`OnPaint()`方法。
```
```py
def OnPaint(self, event):
```
这是`OnPaint()`方法的签名。
```
```py
g = event.Graphics
```
为了在表单上绘图,我们必须获取`Graphics`对象。 在窗体上绘图实际上是在调用`Graphics`对象的各种方法。
```
```py
pen = Pen(Color.Black, 1)
pen.DashStyle = DashStyle.Dot
......@@ -94,14 +94,14 @@ g.DrawLine(pen, 20, 40, 250, 40)
我们创建一个`Pen`对象。 该对象用于绘制形状的轮廓。 比我们设置点划线`DashStyle`。 最后,我们用`DrawLine()`方法画线。 第一个参数是钢笔对象。 接下来的四个值是线的起点和终点的 x 和 y 值。
```
```py
pen.DashPattern = (6, 8, 1, 1, 1, 1, 1, 1)
```
有几个内置的`DashStyle`值。 我们可以使用`DashPattern`属性来创建自己的样式。 乍一看可能很难。 但是模式只是填充和空值的元组。
```
```py
pen.Dispose()
g.Dispose()
......@@ -119,7 +119,7 @@ Winforms 库中的颜色表示 ARGB(alpha,红色,绿色,蓝色)颜色
`colors.py`
```
```py
#!/usr/bin/ipy
import clr
......@@ -161,7 +161,7 @@ Application.Run(IForm())
我们用 9 种不同的颜色绘制 9 个矩形。
```
```py
g.FillRectangle(Brushes.Sienna, 10, 15, 90, 60)
```
......@@ -178,7 +178,7 @@ Figure: Colors
`hatches.py`
```
```py
#!/usr/bin/ipy
import clr
......@@ -240,14 +240,14 @@ Application.Run(IForm())
这次,我们用九种不同的图案(称为剖面线)填充了九个矩形。
```
```py
hb = HatchBrush(HatchStyle.Cross, Color.Black, self.BackColor)
```
在这里,我们创建一个`HatchBrush`对象。 参数是图案填充样式以及前景色和背景色。 背景颜色设置为表单的颜色,因此看起来就像我们在表单上绘制的一样。
```
```py
g.FillRectangle(hb, 10, 15, 90, 60)
```
......@@ -264,7 +264,7 @@ Figure: Hatches
`basicshapes.py`
```
```py
#!/usr/bin/ipy
import clr
......@@ -316,28 +316,28 @@ Application.Run(IForm())
该代码示例在表单上绘制六个形状。 矩形,正方形,圆形,椭圆形,多边形和扇形。
```
```py
g.SmoothingMode = SmoothingMode.AntiAlias
```
这使绘图更平滑。
```
```py
g.FillRectangle(Brushes.Gray, 20, 20, 120, 80)
```
这条线用灰色填充矩形。 参数是画笔颜色,矩形左上角的 x,y 坐标以及矩形的宽度和高度。
```
```py
g.FillPolygon(Brushes.Gray, Array[Point]([p1, p2, p3, p4, p5, p6]))
```
这条线绘制了一个包含六个单点的多边形。
```
```py
g.FillPie(Brushes.Gray, Rectangle(290, 130, 90, 90), 0, 315)
```
......@@ -354,7 +354,7 @@ Figure: Basic shapes
`lyrics.py`
```
```py
#!/usr/bin/ipy
import clr
......@@ -427,21 +427,21 @@ Application.Run(IForm())
在我们的示例中,我们在 Winforms 窗体上绘制歌曲的歌词。
```
```py
ft = Font("Purisa", 10)
```
我们使用 10 磅高的 Purisa 字体。
```
```py
pt = PointF(20.0, 20.0)
```
要在表单上绘制字符串,我们必须使用浮点值。
```
```py
g.DrawString("Meet you downstairs in the bar and heard", ft, br, pt)
```
......@@ -458,7 +458,7 @@ Figure: Lyrics
`redrock.py`
```
```py
#!/usr/bin/ipy
import sys
......@@ -503,7 +503,7 @@ Application.Run(IForm())
此代码示例在窗体上绘制城堡的图像。
```
```py
def loadImage(self):
try:
self.castle = Bitmap("redrock.png")
......@@ -515,14 +515,14 @@ def loadImage(self):
我们加载城堡的图像。
```
```py
r = Rectangle(1, 1, self.castle.Width, self.castle.Height)
```
我们确定将要绘制的矩形。
```
```py
g.DrawImage(self.castle, r)
```
......
......@@ -10,7 +10,7 @@
`donut.py`
```
```py
#!/usr/bin/ipy
import clr
......@@ -51,7 +51,7 @@ Application.Run(IForm())
我们在表格上画了五行。 每行具有不同的`DashStyle`
```
```py
size = self.ClientSize
g.TranslateTransform(size.Width/2, size.Height/2)
g.DrawEllipse(pen, -125, -125, 250, 250)
......@@ -60,7 +60,7 @@ g.DrawEllipse(pen, -125, -125, 250, 250)
我们在表格中间画一个圆。
```
```py
for i in range(0, 36):
g.DrawEllipse(pen, 0, 0, 120, 50)
g.RotateTransform(10)
......@@ -81,7 +81,7 @@ Figure: Donut
`transparentrectangles.py`
```
```py
#!/usr/bin/ipy
import clr
......@@ -117,21 +117,21 @@ Application.Run(IForm())
在示例中,我们将绘制十个具有不同透明度级别的矩形。
```
```py
color = Color.FromArgb(i*25, 0, 0, 255)
```
该行创建一个颜色对象。 第一个值是 Alpha 透明度。
```
```py
brush = SolidBrush(color)
```
我们用颜色创建画笔。
```
```py
g.FillRectangle(brush, 50*i, 20, 40, 40)
```
......@@ -148,7 +148,7 @@ Figure: Transparent rectangles
`grayscale.py`
```
```py
#!/usr/bin/ipy
import clr
......@@ -213,35 +213,35 @@ Application.Run(IForm())
我们的示例中有两个图像。 一种颜色和一种灰度。
```
```py
self.rotunda = self.loadImage()
```
`loadImage()`方法从磁盘的当前工作目录加载位图。
```
```py
self.gs = self.grayScale(self.rotunda.Clone())
```
`grayScale()`方法从彩色图像制作灰度图像。 我们将圆形大厅图像的副本作为此方法的参数。
```
```py
c = image.GetPixel(i, j)
```
我们从图像中获得所有像素。
```
```py
lum = 0.299*c.R + 0.587*c.G + 0.114*c.B
```
该方程式计算灰度图像的亮度。 如果我们使用这些因素来缩放颜色的红色,绿色和蓝色部分,则人眼会将图像视为灰色。
```
```py
image.SetPixel(i, j, Color.FromArgb(lum, lum, lum))
```
......@@ -254,7 +254,7 @@ image.SetPixel(i, j, Color.FromArgb(lum, lum, lum))
`gradients.py`
```
```py
#!/usr/bin/ipy
import clr
......@@ -313,7 +313,7 @@ Application.Run(IForm())
我们绘制五个矩形,这些矩形填充有不同的线性渐变。
```
```py
pt1 = Point(5, 5)
pt2 = Point(25, 25)
......@@ -321,7 +321,7 @@ pt2 = Point(25, 25)
这两个是线性渐变画笔的控制点。
```
```py
lg = LinearGradientBrush(pt1, pt2, Color.Red, Color.Black)
```
......@@ -338,7 +338,7 @@ Figure: Gradients
`waiting.py`
```
```py
#!/usr/bin/ipy
import clr
......@@ -408,7 +408,7 @@ Application.Run(IForm())
我们用八个不同的 alpha 值绘制八条线。
```
```py
self.timer = Timer(Container())
self.timer.Enabled = True
self.timer.Interval = 80
......@@ -418,7 +418,7 @@ self.timer.Tick += self.On
我们使用`Timer`制作动画。
```
```py
trs = (
( 0, 35, 70, 100, 150, 180, 210, 250 ),
...
......@@ -428,7 +428,7 @@ trs = (
这是此演示中使用的透明度值的二维集合。 有 8 行,每行一种状态。 8 行中的每行将连续使用这些值。
```
```py
pen = Pen(color, 3)
pen.StartCap = LineCap.Round
pen.EndCap = LineCap.Round
......@@ -437,14 +437,14 @@ pen.EndCap = LineCap.Round
我们使线条更粗一些,以便更好地显示它们。 我们用带帽的线画线。
```
```py
color = Color.FromArgb(trs[self.count%8][i], 30, 30, 30)
```
在这里,我们定义了一条线的透明度值。
```
```py
g.DrawLine(pen, 0, -10, 0, -40)
g.RotateTransform(45)
......
......@@ -14,7 +14,7 @@
`board.py`
```
```py
import clr
clr.AddReference("System.Drawing")
clr.AddReference("System")
......@@ -202,7 +202,7 @@ class Board(UserControl):
`WIDTH``HEIGHT`常数确定电路板的大小。 `DOT_SIZE`是苹果的大小和蛇的点。 `ALL_DOTS`常数定义了板上可能的最大点数。 (`900 = 300 * 300 / 10 * 10``RAND_POS`常数用于计算苹果的随机位置。 `DELAY`常数确定游戏的速度。
```
```py
x = [0] * ALL_DOTS
y = [0] * ALL_DOTS
......@@ -212,7 +212,7 @@ y = [0] * ALL_DOTS
`move()`方法中,我们有游戏的密钥算法。 要了解它,请看一下蛇是如何运动的。 您控制蛇的头。 您可以使用光标键更改其方向。 其余关节在链上向上移动一个位置。 第二关节移动到第一个关节的位置,第三关节移动到第二个关节的位置,依此类推。
```
```py
while z > 0:
x[z] = x[(z - 1)]
y[z] = y[(z - 1)]
......@@ -222,7 +222,7 @@ while z > 0:
该代码将关节向上移动。
```
```py
if self.left:
x[0] -= DOT_SIZE
......@@ -232,7 +232,7 @@ if self.left:
`checkCollision()`方法中,我们确定蛇是否击中了自己或撞墙之一。
```
```py
while z > 0:
if z > 4 and x[0] == x[z] and y[0] == y[z]:
self.inGame = False
......@@ -242,7 +242,7 @@ while z > 0:
如果蛇用头撞到其关节之一,则游戏结束。
```
```py
if y[0] >= HEIGHT - DOT_SIZE - self.TITLEBAR_HEIGHT:
self.inGame = False
......@@ -258,7 +258,7 @@ Figure: Collision
`locateApple()`方法在表格上随机定位一个苹果。
```
```py
rand = Random()
r = rand.Next(RAND_POS)
......@@ -266,7 +266,7 @@ r = rand.Next(RAND_POS)
我们得到一个从 0 到`RAND_POS-1`的随机数。
```
```py
self.apple_x = r * DOT_SIZE
...
self.apple_y = r * DOT_SIZE
......@@ -277,7 +277,7 @@ self.apple_y = r * DOT_SIZE
`OnKeyUp()`方法中,我们确定了键击玩家击键的时间。
```
```py
if key == Keys.Left and not self.right:
self.left = True
self.up = False
......@@ -289,7 +289,7 @@ if key == Keys.Left and not self.right:
`snake.py`
```
```py
#!/usr/bin/ipy
import clr
......@@ -321,7 +321,7 @@ Application.Run(IForm())
这是主要的类。
```
```py
borderWidth = (self.Width - self.ClientSize.Width) / 2
titleBarHeight = self.Height - self.ClientSize.Height - borderWidth
......@@ -329,7 +329,7 @@ titleBarHeight = self.Height - self.ClientSize.Height - borderWidth
在这里,我们获得窗体控件的边框宽度和标题栏高度。 这些值对于蛇与边界的碰撞检测是必需的。
```
```py
board.BORDER_WIDTH = borderWidth
board.TITLEBAR_HEIGHT = titleBarHeight
......
......@@ -25,7 +25,7 @@ Figure: Tetrominoes
`tetris.py`
```
```py
#!/usr/bin/ipy
import clr
......@@ -418,7 +418,7 @@ Application.Run(IForm())
我对游戏做了一些简化,以便于理解。 游戏启动后立即开始。 我们可以通过按`p`键暂停游戏。 空格键将把俄罗斯方块放在底部。 `d` 键会将棋子下降一行。 (它可以用来加快下降速度。)游戏以恒定速度运行,没有实现加速。 分数是我们已删除的行数。
```
```py
class Tetrominoes(object):
NoShape = 0
ZShape = 1
......@@ -433,7 +433,7 @@ class Tetrominoes(object):
tetrominoes 有七种不同类型。
```
```py
...
self.curX = 0
self.curY = 0
......@@ -445,7 +445,7 @@ self.board = []
在开始游戏周期之前,我们先初始化一些重要的变量。 `self.board`变量是`Tetrominoes`的列表。 它表示各种形状的位置以及板上形状的其余部分。
```
```py
def ClearBoard(self):
for i in range(Board.BoardHeight * Board.BoardWidth):
self.board.append(Tetrominoes.NoShape)
......@@ -456,7 +456,7 @@ def ClearBoard(self):
俄罗斯方块游戏中的绘图是通过`OnPaint()`方法完成的。
```
```py
for i in range(Board.BoardHeight):
for j in range(Board.BoardWidth):
shape = self.shapeAt(j, Board.BoardHeight - i - 1)
......@@ -469,7 +469,7 @@ for i in range(Board.BoardHeight):
游戏的绘图分为两个步骤。 在第一步中,我们绘制所有形状或已放置到板底部的形状的其余部分。 所有正方形都将记住在`self.board`列表中。 我们使用`ShapeAt()`方法访问它。
```
```py
if self.curPiece.shape() != Tetrominoes.NoShape:
for i in range(4):
x = self.curX + self.curPiece.x(i)
......@@ -484,7 +484,7 @@ if self.curPiece.shape() != Tetrominoes.NoShape:
`OnKeyUp()`方法中,我们检查按键是否按下。
```
```py
elif key == Keys.Left:
self.tryMove(self.curPiece, self.curX - 1, self.curY)
......@@ -494,7 +494,7 @@ elif key == Keys.Left:
`TryMove()`方法中,我们尝试移动形状。 如果无法移动该片段,则返回`False`
```
```py
for i in range(4):
x = newX + newPiece.x(i)
y = newY - newPiece.y(i)
......@@ -507,7 +507,7 @@ for i in range(4):
如果形状在板的边缘或与其他零件相邻,则返回`False`
```
```py
self.curPiece = newPiece
self.curX = newX
self.curY = newY
......@@ -518,7 +518,7 @@ return True
否则,我们将当前的下降片放到新位置并返回`True`
```
```py
def OnTick(self, sender, event):
if self.isWaitingAfterLine:
......@@ -533,7 +533,7 @@ def OnTick(self, sender, event):
如果片段触底,我们将调用`RemoveFullLines()`方法。 首先,我们找出所有实线。
```
```py
rowsToRemove = []
for i in range(Board.BoardHeight):
n = 0
......@@ -547,7 +547,7 @@ for i in range(Board.BoardHeight):
我们在董事会中循环。 一排可以有十个形状。 如果该行已满,例如 n 等于 10,我们存储行号以供以后删除。
```
```py
rowsToRemove.reverse()
for m in rowsToRemove:
......@@ -559,7 +559,7 @@ for m in rowsToRemove:
这些代码行将删除所有行。 我们颠倒了`rowsToRemove`列表的顺序,因此我们从最底部的全行开始。 我们要做的是通过将一行中的所有行向下放置一行来删除整行。 对于所有实线都会发生这种情况。在我们的情况下,我们使用天真重力。 这意味着碎片可能漂浮在空的间隙上方。
```
```py
def NewPiece(self):
self.curPiece = self.nextPiece
statusbar = self.Parent.statusbar
......@@ -577,7 +577,7 @@ def NewPiece(self):
`NewPiece()`方法随机创建一个新的俄罗斯方块。 如果棋子无法进入其初始位置,例如 `TryMove()`方法返回`False`,游戏结束。
```
```py
colors = [ (0, 0, 0), (204, 102, 102),
... ]
......@@ -591,7 +591,7 @@ dark = [ (0, 0, 0), (128, 59, 59),
一共有三种颜色。 `colours`列表存储正方形填充的颜色值。 七块每个都有其自己的颜色。 `light``dark`存储线条的颜色,使正方形看起来像 3D。 这些颜色是相同的,只是越来越浅。 我们将在正方形的顶部和左侧绘制两条浅色的线条,并在右侧和底部绘制两条深色的线条。
```
```py
g.DrawLine(pen, x, y + self.SquareHeight() - 1, x, y)
g.DrawLine(pen, x, y, x + self.SquareWidth() - 1, y)
......@@ -601,7 +601,7 @@ g.DrawLine(pen, x, y, x + self.SquareWidth() - 1, y)
`Shape`类保存有关俄罗斯方块的信息。
```
```py
self.coords = [[0,0] for i in range(4)]
```
......@@ -616,7 +616,7 @@ Figure: Coordinates
`RotateLeft()`方法将一块向左旋转。
```
```py
if self.pieceShape == Tetrominoes.SquareShape:
return self
......@@ -624,7 +624,7 @@ if self.pieceShape == Tetrominoes.SquareShape:
如果我们有`Tetrominoes.SquareShape`个,我们什么也不做。 此形状始终相同。
```
```py
result = Shape()
result.pieceShape = self.pieceShape
for i in range(4):
......
......@@ -18,7 +18,7 @@ GTK 是用于创建图形用户界面的库。 该库是用 C 编程语言创建
在我们的第一个代码示例中,我们将在屏幕上居中放置一个小窗口。
```
```basic
' ZetCode FreeBASIC GTK tutorial
'
' This program centers a window on
......@@ -53,42 +53,42 @@ END 0
此代码在屏幕上使窗口居中。 它是 FreeBASIC 和 C 代码的混合体。
```
```basic
#include once "gtk/gtk.bi"
```
这是从 FreeBASIC 运行 GTK 代码所需的头文件。
```
```basic
#define NULL 0
```
FreeBASIC 中没有内置的`NULL`值。 为了更类似于 GTK C 代码,我们定义了一个`NULL`值。
```
```basic
Dim As GtkWidget Ptr win
```
我们声明一个指向`GtkWidget`的指针。
```
```basic
gtk_init(NULL, NULL)
```
我们启动 GTK 库。
```
```basic
win = gtk_window_new(GTK_WINDOW_TOPLEVEL)
```
我们创建一个`GtkWidget`窗口。 窗口类型为`GTK_WINDOW_TOPLEVEL`。 顶层窗口具有标题栏和边框。 它们由窗口管理器管理。
```
```basic
gtk_window_set_title(GTK_WINDOW(win), "Center")
gtk_widget_set_size_request(win, 250, 150)
gtk_window_set_position(GTK_WINDOW(win), GTK_WIN_POS_CENTER)
......@@ -97,7 +97,7 @@ gtk_window_set_position(GTK_WINDOW(win), GTK_WIN_POS_CENTER)
这三行为窗口设置标题,调整窗口大小并将其放置在屏幕中央。
```
```basic
g_signal_connect(G_OBJECT(win), "destroy", _
G_CALLBACK (@gtk_main_quit), NULL)
......@@ -105,28 +105,28 @@ g_signal_connect(G_OBJECT(win), "destroy", _
如果单击 x 标记,或按 `Alt + F4` 终止应用,则会发出破坏信号。 默认情况下,该窗口不对销毁信号做出反应。 我们必须通过将`destroy`信号连接到`gtk_main_quit()`函数来显式终止应用。 有两个重要角色。 下划线和`@`字符。 下划线是 FreeBASIC 中的换行符。 如果代码行超过一行,则必须使用它。 `@`字符为我们提供了`gtk_main_quit()`函数的地址。 在 C 语言中,函数名称是函数的地址。 在 FreeBASIC 中并非如此,这就是我们使用@字符的原因。
```
```basic
gtk_widget_show(win)
```
该窗口已在内存中创建。 现在我们使用`gtk_widget_show`功能在屏幕上显示窗口。
```
```basic
gtk_main()
```
我们进入应用的主循环。 从这一点开始,应用就坐下来等待事件发生。
```
```basic
END 0
```
我们完成了 FreeBASIC 代码。
```
```basic
$ fbc simple.bas
$ ./simple
......@@ -142,7 +142,7 @@ Figure: Simple example
在第二个示例中,我们在窗口上放置一个按钮小部件。 首先,我们在窗口上放置一个固定的容器,然后在该容器上放置按钮。 单击该按钮将终止该应用。
```
```basic
' ZetCode FreeBASIC GTK tutorial
'
' In this example, we place a close
......@@ -192,7 +192,7 @@ END 0
这是关闭按钮示例的源代码。
```
```basic
Dim As GtkWidget Ptr win
Dim As GtkWidget Ptr fixed
Dim As GtkWidget Ptr button
......@@ -201,7 +201,7 @@ Dim As GtkWidget Ptr button
我们声明三个变量。 一个用于顶层窗口,它是 GUI 应用的基本框架。 一个用于容器。 容器是一种特殊的小部件。 它是不可见的。 其唯一目的是包含其他小部件。 在我们的例子中,是按钮小部件。
```
```basic
fixed = gtk_fixed_new()
gtk_container_add(GTK_CONTAINER(win), fixed)
......@@ -209,7 +209,7 @@ gtk_container_add(GTK_CONTAINER(win), fixed)
这两行创建一个容器小部件,并将其放置在窗口小部件内。
```
```basic
button = gtk_button_new_with_label("Close")
gtk_widget_set_size_request(button, 80, 35)
......@@ -217,14 +217,14 @@ gtk_widget_set_size_request(button, 80, 35)
我们创建一个按钮小部件,并将其设置为`80x35`像素。
```
```basic
gtk_fixed_put(GTK_FIXED(fixed), button, 50, 50)
```
我们在`x = 50``y = 50`坐标处将一个按钮放入容器。 这称为绝对定位。 它适合于小示例,但在更复杂的程序中,我们使用布局管理器。
```
```basic
g_signal_connect(G_OBJECT(button), "clicked", _
G_CALLBACK (@gtk_main_quit), NULL)
......@@ -232,7 +232,7 @@ g_signal_connect(G_OBJECT(button), "clicked", _
当我们点击按钮时,发出点击的信号。 `g_signal_connect()`函数将回调(在我们的情况下为内置`gtk_main_quit()`函数)连接到按钮小部件发出的`clicked`信号。
```
```basic
gtk_widget_show_all(win)
```
......@@ -247,7 +247,7 @@ Figure: Close button
在以下示例中,我们在窗口上显示图像。
```
```basic
' ZetCode FreeBASIC GTK tutorial
'
' This example shows an image on
......@@ -290,7 +290,7 @@ END 0
我们在窗口上显示图像。
```
```basic
Dim As GtkWidget Ptr win
Dim As GtkWidget Ptr image
......@@ -298,21 +298,21 @@ Dim As GtkWidget Ptr image
在此示例中,我们只有两个小部件。 窗口小部件和图像小部件。
```
```basic
gtk_window_set_resizable(GTK_WINDOW(win), FALSE)
```
窗口无法调整大小。 请注意,我们没有为窗口设置大小。 在这种情况下,窗口将自动适合图像的大小。
```
```basic
gtk_container_set_border_width(GTK_CONTAINER(win), 2)
```
我们在容器周围留出一些空白空间。
```
```basic
image = gtk_image_new_from_file("redrock.png")
gtk_container_add(GTK_CONTAINER(win), image)
......@@ -324,7 +324,7 @@ gtk_container_add(GTK_CONTAINER(win), image)
在下一个代码示例中,我们将创建一个简单的菜单。
```
```basic
' ZetCode FreeBASIC GTK tutorial
'
' This example shows a simple menu
......@@ -382,7 +382,7 @@ END 0
这些代码行创建一个简单的菜单。 它只有一个菜单项,选择该菜单项将终止应用。 创建菜单栏有点令人困惑。 我们必须记住,菜单栏和菜单都来自同一个窗口小部件,即菜单外壳。 菜单项仅是菜单的有效子项。 它们还用于实现子菜单。
```
```basic
Dim As GtkWidget Ptr win
Dim As GtkWidget Ptr vbox
......@@ -395,7 +395,7 @@ Dim As GtkWidget Ptr qmi
我们有六个小部件的六个变量。 一个小部件是一个垂直框,它将设置布局。 菜单栏是一个水平小部件,我们在其上放置菜单。 菜单包含菜单项,这些菜单项会执行某些操作。 就像保存文档或终止应用一样。
```
```basic
vbox = gtk_vbox_new(FALSE, 0)
gtk_container_add(GTK_CONTAINER(win), vbox)
gtk_box_pack_start(GTK_BOX(vbox), menubar, FALSE, FALSE, 3)
......@@ -404,7 +404,7 @@ gtk_box_pack_start(GTK_BOX(vbox), menubar, FALSE, FALSE, 3)
我们创建一个垂直框,使其成为顶层窗口的容器。 `gtk_vbox_new()`函数的第一个参数称为同质参数。 如果设置为`TRUE`,则一个框中的所有小部件都具有相等的空间分配。 我们不希望这样,因为菜单栏仅占用窗口的一小部分。 第二个参数是子项之间的空间。
```
```basic
menubar = gtk_menu_bar_new()
fmenu = gtk_menu_new()
......@@ -412,7 +412,7 @@ fmenu = gtk_menu_new()
在这段代码中,我们创建一个菜单栏和一个菜单。
```
```basic
fmi = gtk_menu_item_new_with_label("File")
qmi = gtk_menu_item_new_with_label("Quit")
......@@ -420,14 +420,14 @@ qmi = gtk_menu_item_new_with_label("Quit")
创建两个菜单项。
```
```basic
gtk_menu_item_set_submenu(GTK_MENU_ITEM(fmi), fmenu)
```
此代码行实现了文件菜单。 逻辑是菜单栏是菜单外壳。 文件菜单也是菜单外壳。 这就是为什么我们将文件菜单视为子菜单或子外壳。
```
```basic
gtk_menu_shell_append(GTK_MENU_SHELL(fmenu), qmi)
gtk_menu_shell_append(GTK_MENU_SHELL(menubar), fmi)
......@@ -435,14 +435,14 @@ gtk_menu_shell_append(GTK_MENU_SHELL(menubar), fmi)
菜单项通过调用`gtk_menu_shell_append()`功能实现。 菜单项将附加到菜单外壳。 在我们的情况下,退出菜单项被附加到文件菜单,并且文件菜单项也被附加到菜单栏。
```
```basic
gtk_box_pack_start(GTK_BOX(vbox), menubar, FALSE, FALSE, 0)
```
`gtk_box_pack_start()`函数调用将菜单栏添加到垂直框中。 第一个参数是容器,我们在其中放置子窗口小部件。 第二个参数是子窗口小部件。 第三个参数是`expand`参数。 扩展参数设置为`TRUE`的子代将占用垂直框的额外空间。 这些额外的空间将在它们之间平均分配。 我们不希望菜单栏占用任何额外的空间,因此我们将`expand`参数设置为`FALSE`。 如果将扩展设置为`FALSE`,则第四个参数无效。 最后一个参数是`padding`,它在子小部件之间增加了一些额外的空间。 我们不添加任何额外的空间。
```
```basic
g_signal_connect(G_OBJECT(qmi), "activate", _
G_CALLBACK(@gtk_main_quit), NULL)
......@@ -458,7 +458,7 @@ Figure: Simple menu example
以下示例将说明我们如何对输入信号做出反应。 当我们使用鼠标指针进入小部件的区域时,将发出`enter`信号。
```
```basic
' ZetCode FreeBASIC GTK tutorial
'
' In this code example, we react to the
......@@ -519,7 +519,7 @@ END 0
我们将按钮小部件放入固定的容器中。 当我们输入按钮小部件的区域时,将调用`enter_button()`子例程。 在子例程中,我们更改按钮的背景色。
```
```basic
Sub enter_button Cdecl (Byval widget As GtkWidget Ptr, _
Byval dat As gpointer)
...
......@@ -529,14 +529,14 @@ End Sub
这是`enter_button()`子例程,我们在其中对`enter`信号做出反应。 `Cdecl`关键字指定子例程的调用约定。 在此调用约定中,所有参数都以列出它们的相反顺序(即从右到左)传递。 对于我们而言,这并不重要。
```
```basic
Dim col As GdkColor
```
我们创建一个本地`GdkColor`变量。 它是用于描述 GTK 应用中的颜色的结构。
```
```basic
col.red = 27000
col.green = 30325
col.blue = 34181
......@@ -545,14 +545,14 @@ col.blue = 34181
在这里,我们设置颜色。
```
```basic
gtk_widget_modify_bg(widget, GTK_STATE_PRELIGHT, @col)
```
`gtk_widget_modify_bg()`设置处于特定状态的小部件的背景颜色。 在我们的情况下,状态为`GTK_STATE_PRELIGHT`,这是鼠标指针悬停在小部件上方时的状态。 第三个参数是指向颜色结构的指针。
```
```basic
g_signal_connect(G_OBJECT(btn), "enter", _
G_CALLBACK(@enter_button), NULL)
......@@ -564,7 +564,7 @@ g_signal_connect(G_OBJECT(btn), "enter", _
在下面的示例中,我们将一个检查按钮放入固定容器中。 我们将通过选中和取消选中复选按钮来显示和隐藏窗口的标题。
```
```basic
' ZetCode FreeBASIC GTK tutorial
'
' This example a check button widget
......@@ -622,7 +622,7 @@ END 0
这是检查按钮示例的代码。
```
```basic
Sub toggle_title Cdecl (Byval widget As GtkWidget Ptr, _
Byval win As gpointer)
......@@ -630,7 +630,7 @@ Sub toggle_title Cdecl (Byval widget As GtkWidget Ptr, _
如果单击复选按钮,我们将调用`toggle_title()`函数。 在这种情况下,我们需要指向两个对象的指针。 我们需要一个指向检查按钮的指针来确定它是否被检查。 我们还需要指向窗口的指针来设置或取消设置其标题。
```
```basic
If gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(widget)) Then
gtk_window_set_title(win, "Check button")
Else
......@@ -640,7 +640,7 @@ Else
我们使用`gtk_toggle_button_get_active()`功能确定检查按钮的状态。 我们使用`gtk_window_set_title()`功能设置窗口的标题。
```
```basic
g_signal_connect(cbtn, "clicked", _
G_CALLBACK(@toggle_title), cast(gpointer, win))
......@@ -656,7 +656,7 @@ Figure: Check button example
在 FreeBASIC GTK 教程的最后一个示例中,我们将展示组合框小部件。
```
```basic
' ZetCode FreeBASIC GTK tutorial
'
' In this example, we present the combo box
......@@ -724,7 +724,7 @@ END 0
我们有两个小部件:组合框和标签。 从组合框中选择的选项将显示在标签中。
```
```basic
Dim As gchar Ptr text
text = gtk_combo_box_get_active_text(GTK_COMBO_BOX(widget))
......@@ -735,7 +735,7 @@ g_free(text)
在这些行中,我们从组合框中检索文本并将其设置为标签。 我们使用指向`gchar`的指针。 它是`glib`库的基本类型,它是 GTK 库的基础。 我们释放从组合框中检索文本时创建的内存。
```
```basic
combo = gtk_combo_box_new_text()
gtk_combo_box_append_text(GTK_COMBO_BOX(combo), "Ubuntu")
gtk_combo_box_append_text(GTK_COMBO_BOX(combo), "Mandriva")
......@@ -745,7 +745,7 @@ gtk_combo_box_append_text(GTK_COMBO_BOX(combo), "Mandriva")
将创建组合框窗口小部件并填充数据。
```
```basic
label = gtk_label_new("-")
gtk_fixed_put(GTK_FIXED(fixed), label, 50, 110)
......@@ -753,7 +753,7 @@ gtk_fixed_put(GTK_FIXED(fixed), label, 50, 110)
标签窗口小部件已创建并放入容器中。
```
```basic
g_signal_connect(G_OBJECT(combo), "changed", _
G_CALLBACK(@combo_selected), cast(gpointer, label))
......
......@@ -16,21 +16,21 @@ Jython 是用 Java 编写的 Python 编程语言的实现。 Jython 可以导入
另一种方法是从 [jython.org](http://jython.org) 网站下载安装程序。
```
```py
$ java -jar jython_installer-2.5.2rc2.jar
```
我们安装了 Jython。 您将经历一系列对话框。
```
```py
$ java -jar jython.jar simple.py
```
我们已经在选定目录中安装了 Jython。 在此目录中,我们将找到`jython.jar`文件,该文件用于执行 Jython 脚本。
```
```py
$ cat /usr/local/bin/jython
#!/bin/bash
......@@ -44,7 +44,7 @@ $ cat /usr/local/bin/jython
在第一个示例中,我们将在屏幕上显示一个基本窗口。
```
```py
#!/usr/local/bin/jython
# -*- coding: utf-8 -*-
......@@ -83,49 +83,49 @@ if __name__ == '__main__':
尽管这段代码很小,但是应用窗口可以做很多事情。 可以调整大小,最大化,最小化。 随之而来的所有复杂性对应用程序员都是隐藏的。
```
```py
from javax.swing import JFrame
```
我们导入一个`JFrame`类。 `JFrame`是带有标题和边框的顶层窗口。
```
```py
self.initUI()
```
我们将用户界面的创建委托给`initUI()`方法。
```
```py
self.setTitle("Simple")
```
我们使用`setTitle()`方法设置窗口的标题。
```
```py
self.setSize(250, 200)
```
我们设置窗口的大小。
```
```py
self.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE)
```
如果单击标题栏的关闭按钮,此方法可确保窗口终止。 默认情况下,没有任何反应。
```
```py
self.setLocationRelativeTo(None)
```
我们将窗口置于屏幕中央。
```
```py
self.setVisible(True)
```
......@@ -136,7 +136,7 @@ self.setVisible(True)
工具提示是一个小的矩形窗口,它提供有关对象的简短信息。 它通常是一个 GUI 组件。 它是应用帮助系统的一部分。
```
```py
#!/usr/local/bin/jython
# -*- coding: utf-8 -*-
......@@ -188,7 +188,7 @@ if __name__ == '__main__':
在示例中,我们为框架和按钮设置工具提示。
```
```py
panel = JPanel()
self.getContentPane().add(panel)
......@@ -196,14 +196,14 @@ self.getContentPane().add(panel)
我们创建一个`JPanel`组件。 它是一个通用的轻量级容器。 `JFrame`有一个区域,您可以在其中放置名为内容窗格的组件。 我们将面板放入此窗格。
```
```py
panel.setLayout(None)
```
默认情况下,`JPanel`具有一个`FlowLayout`管理器。 布局管理器用于将小部件放置在容器上。 如果我们调用`setLayout(None)`,则可以绝对定位组件。 为此,我们使用`setBounds()`方法。
```
```py
panel.setToolTipText("A Panel container")
```
......@@ -218,7 +218,7 @@ Figure: Tooltip
在本节的最后一个示例中,我们将创建一个退出按钮。 当我们按下此按钮时,应用终止。
```
```py
#!/usr/local/bin/jython
# -*- coding: utf-8 -*-
......@@ -273,7 +273,7 @@ if __name__ == '__main__':
我们在窗口上放置一个`JButton`。 我们将向该按钮添加一个动作监听器。
```
```py
qbutton = JButton("Quit", actionPerformed=self.onQuit)
qbutton.setBounds(50, 60, 80, 30)
......@@ -281,7 +281,7 @@ qbutton.setBounds(50, 60, 80, 30)
在这里,我们创建一个按钮。 我们通过调用`setBounds()`方法对其进行定位。 `actionPerformed`参数指定单击按钮时调用的方法。
```
```py
def onQuit(self, e):
System.exit(0)
......
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册