如何在Qt Designer中实现信号/槽
我正在尝试把一个按钮的 click()
信号连接到我自己写的函数。这个按钮是在我用 QT Designer 创建的一个小部件里。我是这样用 QUiLoader 加载 .ui
文件的:
class MyWidget(QtGui.QMainWindow):
def __init__(self, *args):
QtGui.QMainWindow.__init__(self, *args)
loader = QtUiTools.QUiLoader()
file = QtCore.QFile("pyside_ui_qtdesigner_form_test.ui")
file.open(QtCore.QFile.ReadOnly)
self.myWidget = loader.load(file, self)
file.close()
self.setCentralWidget(self.myWidget)
btn = self.myWidget.findChild(QtGui.QPushButton, "HelloWorldButton")
btn.clicked.connect(self.slot1)
def slot1(self):
print "Received"
这样连接按钮的 clicked()
信号对吗?我看到在 Qt Designer 里可以直接连接信号和槽,但我该如何在代码中准备和实现这种连接呢?
另外一个问题是:上面的代码可以运行,但主窗口的大小不对。怎样才能确保它显示在正确的大小呢?我应该用最小高度/宽度的限制来解决这个问题吗?
2 个回答
0
我对 .ui
文件进行了修改:
- 先关闭 QT 设计器
- 在信号/槽区域编辑
.ui
文件 - 然后运行它
12
使用信号和槽编辑模式可以直接把预定义的Qt信号连接到预定义的Qt槽。
比如说,对于一个简单对话框里的“关闭”按钮,你只需要把连接从按钮拖到对话框,选择clicked()
信号和reject()
槽,点击“确定”,就没别的事情需要做了。
如果你想自己定义信号或槽,就不需要在设计器里提前“准备”什么,所有的工作都可以在你自己的代码里完成。
你的例子已经很好地展示了这一点,但连接可以做得更简单、更干净,比如这样:
self.myWidget.HelloWorldButton.clicked.connect(self.slot1)
至于你的主窗口“大小不对”的问题,从你提供的代码来看很难判断,但可能是因为你没有在加载的窗口小部件上设置布局。
顺便问一下,你为什么使用QUiLoader
?用pyuic4
编译Python模块会灵活很多,而且你可以从生成的代码中学到很多东西。
编辑
对我来说,在主表单上设置布局可以解决你提到的调整大小问题。
如果你不知道怎么做:在设计器中,右键点击主表单的空白部分,然后从菜单中选择布局/网格布局
(工具栏上也有这个按钮)。
完成后,调整表单大小会自动拉伸以适应里面的控件。