如何实现Qt Designer中定义的信号/槽

时间:2012-01-05 16:23:01

标签: python pyqt pyside signals-slots 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中连接信号和插槽,但是我如何准备并在代码中进行这样的连接? 附带问题:上面的代码有效,但主窗口显示错误的大小。如何确保尺寸合适?我应该用最小的高度/宽度约束来做这件事吗?

1 个答案:

答案 0 :(得分:12)

使用Signals and Slots Editing Mode将预定义的Qt信号直接连接到预定义的Qt插槽。

因此,对于简单对话框中的“关闭”按钮,您只需将连接从按钮拖动到对话框,选择clicked()信号和reject()插槽,单击“确定”,然后没有什么可做的。

对于您想要自己定义的信号和/或插槽,您无需事先在Designer中“准备”任何内容。一切都应该在你自己的代码中完成。

你的例子已经很好地证明了这一点,但连接可以更加简单干净地完成,如下所示:

self.myWidget.HelloWorldButton.clicked.connect(self.slot1)

对于具有“错误大小”的主窗口:从您显示的代码中很难判断,但可能是因为您没有在正在加载的小部件中设置布局。

BTW:您使用QUiLoader的具体原因是什么?使用pyuic4编译python模块要灵活得多,您可以从生成的代码中学到很多东西。

修改

对我来说,在主窗体上设置布局可以解决您正在讨论的调整大小问题。

如果您不知道如何操作:在Designer中,右键单击主窗体的空白部分,然后从菜单中选择Layout/Layout in a Grid(工具栏上还有一个按钮用于此)。

完成后,调整表单大小会自动拉伸它以适应包含的小部件。