PyQt - создание подкласса QMainWindow для доступа к элементам Gui - PullRequest
0 голосов
/ 27 марта 2012

Я использую QStackedWidget и переключаюсь между различными представлениями. Каждая панель в основном является классом и должна находиться в своем собственном файле.

Проблема в том, что я хочу получить доступ к QTableView из другого файла, не передавая его ссылку в конструктор.

Основной файл:

class MyApp(QMainWindow, Ui_MainWindow):

    def __init__(self, parent=None):
        super(MyApp, self).__init__(parent)
        self.setupUi(self)

2-й файл

from ui_MainWindow import Ui_MainWindow

class LimitsEditor(QMainWindow):
    def __init__(self, session):
        QMainWindow.__init__(self)
        self.tblCommonLimits_horizheader = QHeaderView(Qt.Horizontal)
        self.tblCommonLimits_horizheader = QMainWindow.tblLimits.horizontalHeader()    

Я получаю эту ошибку:

AttributeError: type object 'QMainWindow' has no attribute 'tblLimits'

Как видите, я хочу получить доступ к таблице с именем "tblLimits", которую я создал в QtDesigner, но не могу получить к ней доступ во втором файле.

Есть предложения?

(редактировать для форматирования)

Я редактирую это, чтобы показать, что я делаю, что работает:

В основном при создании экземпляра класса:

self.LimitsEditor = LimitsEditor(self.ui.tblLimits)

В файле LimitsEditor:

class LimitsEditor():
    def __init__(self, tblLimits):
        self.tblLimits = tblLimits

Теперь в основном я могу получить доступ к таблице как «self.ui.tlbLimits» ИЛИ «self.LimitsEditor.tblLimits» Вот как я это делал, и это отлично работает. Мне это показалось не совсем правильным, поэтому мне было интересно, есть ли способ просто унаследовать знания всех элементов пользовательского интерфейса в другом классе / подклассе.

Ответы [ 2 ]

1 голос
/ 29 марта 2012

Если вы пытаетесь сделать так, чтобы LimitsEditor имел доступ к точно такому же экземпляру таблицы, который используется MyApp, то такой подход, который вы пробуете, невозможен. Файл .ui представляет собой описание макета виджетов, который вы применяете к своему классу. Когда вы вызываете setupUi () внутри вашего класса QMainWindow, он создает экземпляры. Фактический модуль пользовательского интерфейса не содержит ссылок на эти экземпляры, к которым вы затем можете обратиться в другом файле.

Вы должны поделиться ссылкой на экземпляр от MyApp до LimitsEditor. Это сводится к дизайнерскому решению. Вот несколько предложений (поскольку я не знаю, как на самом деле организовано ваше приложение)

  1. Везде, где вы управляете составным виджетом, вы можете передать ссылку на экземпляр таблицы вашему LimitsEditor
  2. Пусть ваш LimitsEditor не знает о виджете таблицы и посылает сигналы, которые ваши родительские объекты будут прослушивать и управлять экземпляром таблицы в ответ
  3. Настройте LimitsEditor с eventsFilter для таблицы (в вашем родительском объекте). Ваш LimitsEditor не будет напрямую иметь ссылку на таблицу, а скорее получит для нее события, которые он может обработать.

Ссылаясь на исключение, которое вы видите, QMainWindow является классом PyQt4 и не содержит ваших пользовательских дочерних виджетов. Они расположены в экземпляре вашего пользовательского класса, который содержит вызов setupUi(). Затем вам нужно будет получить к нему доступ через self.tblLimits, но опять-таки это будет только для класса, который фактически использует файл Ui, а не для других случайных классов.

0 голосов
/ 27 марта 2012

При работе с QtDesigner в PyQt вы обычно используете один и тот же шаблон:

  1. Создайте файл конструктора .ui.
  2. Создайте класс для его использования.
  3. Убедитесь, что файл пользовательского интерфейса устанавливает виджеты вашего класса.

Например:

class MyApp(QMainWindow):

    def __init__(self, parent=None):
        super(MyApp, self).__init__(parent)
        self.ui = Ui_MainWindow()
        self.ui.setupUi(self)


class LimitsEditor(QMainWindow):
    def __init__(self, session):
        super(QMainWindow, self).__init__()
        self.ui = Ui_MainWindow()
        self.ui.setupUi(self)

        self.tblCommonLimits_horizheader = QHeaderView(Qt.Horizontal)
        self.tblCommonLimits_horizheader = self.ui.tblLimits.horizontalHeader()

Убедитесь, что вы обращаетесь к виджету через элемент пользовательского интерфейса экземпляра.

...