在Qt Designer中添加的访问小部件

时间:2016-03-23 12:49:13

标签: python qt widget pyside qt-designer

我正在使用Qt Designer创建Qt GUI。在设计器中,我在QSplitter中放置了两个小部件(左侧是一个小部件,右侧是另一个小部件)。

现在我想分别控制每个小部件,但是我的MainWindow上面包含了所有内容的GUI python代码,包括小部件及其内容(标签,文本标签等)。

有没有办法单独访问小部件?这是我的代码:

在MainWindow上:

if __name__ == "__main__":

    import sys
    app = QtGui.QApplication(sys.argv)
    MainWindow = QtGui.QMainWindow()
    ui = mw_gui.Ui_MainWindow()
    ui.setupUi(MainWindow)
    MainWindow.show()

    img_widget = ImageWidget(MainWindow)

    sys.exit(app.exec_())

在我想用来控制右侧小部件的类中:

class ImageWidget(QtGui.QWidget):
    def __init__(self, parent, variables):
        # self.ui = ui
        # self.variables = variables
        if not isinstance(parent, QtGui.QMainWindow):
            raise TypeError('parent must be a QMainWindow')
        super(ImageWidget, self).__init__()

        self._parentWidget = parent

我想访问self.imglabel,它位于右侧小部件内部,但它似乎无法找到它。

2 个答案:

答案 0 :(得分:1)

您应该能够找到名称和类型的小部件:

imglabel = self.ui.findChild(QtGui.QLabel, "imglabel")

答案 1 :(得分:1)

您应该为主窗口创建一个子类,继承自QMainWindowUi_MainWindow。使用这种方法,Qt Designer中添加的所有小部件都将作为实例属性访问:

from PySide import QtGui
from mw_gui import Ui_MainWindow

class MainWindow(QtGui.QMainWindow, Ui_MainWindow):
    def __init__(self):
        super(MainWindow, self).__init__()
        self.setupUi(self)
        self.imglabel.setPixmap(QtGui.QPixmap('image.png'))

if __name__ == "__main__":

    import sys
    app = QtGui.QApplication(sys.argv)
    mainwindow = MainWindow()
    mainwindow.show()
    sys.exit(app.exec_())

这样做也意味着可能不需要单独的控制器类,因为您只需向MainWindow类添加方法即可。如果一切都在一个命名空间中,那么设计就会简单得多。