如何在Qt Designer中实现信号/槽

9 投票
2 回答
11918 浏览
提问于 2025-04-17 09:36

我正在尝试把一个按钮的 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 文件进行了修改:

  1. 先关闭 QT 设计器
  2. 在信号/槽区域编辑 .ui 文件
  3. 然后运行它
12

使用信号和槽编辑模式可以直接把预定义的Qt信号连接到预定义的Qt槽。

比如说,对于一个简单对话框里的“关闭”按钮,你只需要把连接从按钮拖到对话框,选择clicked()信号和reject()槽,点击“确定”,就没别的事情需要做了。

如果你想自己定义信号或槽,就不需要在设计器里提前“准备”什么,所有的工作都可以在你自己的代码里完成。

你的例子已经很好地展示了这一点,但连接可以做得更简单、更干净,比如这样:

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

至于你的主窗口“大小不对”的问题,从你提供的代码来看很难判断,但可能是因为你没有在加载的窗口小部件上设置布局。

顺便问一下,你为什么使用QUiLoader?用pyuic4编译Python模块会灵活很多,而且你可以从生成的代码中学到很多东西。

编辑

对我来说,在主表单上设置布局可以解决你提到的调整大小问题。

如果你不知道怎么做:在设计器中,右键点击主表单的空白部分,然后从菜单中选择布局/网格布局(工具栏上也有这个按钮)。

完成后,调整表单大小会自动拉伸以适应里面的控件。

撰写回答