2016-03-23 4 views
1

Я создаю Qt GUI с Qt Designer. В дизайнере я помещаю два виджета в QSplitter (один виджет слева, другой виджет справа).Доступ к виджетам добавлен в Qt Designer

Дело в том, что теперь я хочу контролировать каждый виджет отдельно, но у моего MainWindow есть код Python GUI всего в нем, включая как виджеты, так и их содержимое (метки, текстовые метки и т. Д.).

Есть ли способ получить доступ к виджетам отдельно? Вот мой код:

На 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, который находится внутри правильного виджета, но, похоже, не находит его.

ответ

1

Вы должны быть в состоянии найти виджет с его именем и типом:

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

Вы должны создать подкласс для главного окна нужно унаследовать от обоих QMainWindow и Ui_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 класса. Дизайн намного проще, если все находится в одном пространстве имен.

Смежные вопросы