Создать виджет для встраивания в QMainWindow - PullRequest
0 голосов
/ 29 ноября 2018

У меня есть задача, которую я пока не могу решить.Работа с PyQt и Qt Creator.

Я хочу встроить пользовательский виджет, созданный в QT Creator, в другой QMainWindow.

1) Шаги, которые я делаю:

Создание файла виджета в QT создателе:

enter image description here

2) Сохранитьэто как * .ui и применить эту строку, чтобы преобразовать его в * .py файл:

pyuic5 gen_settings.ui -o gen_settings.py

3) Откройте его и убедитесь, что он начинается с

from PyQt5 import QtCore, QtGui, QtWidgets

class Ui_gen_settings(object):
    def setupUi(self, gen_settings):
        gen_settings.setObjectName("gen_settings")

4) Какойприводит к вызову функции, конечно:

TypeError: arguments did not match any overloaded call:
  addWidget(self, QWidget): argument 1 has unexpected type 'function'

, когда я вызываю его в другом файле QMainWindow:

class Ui_MainWindow(object):
    def setupUi(self, MainWindow, My_Custom_widget):
        MainWindow.setObjectName("MainWindow")
        self.gridLayout.addWidget(My_Custom_widget, 1, 4, 1, 1)

Есть идеи, как это решить?

1 Ответ

0 голосов
/ 29 ноября 2018

Прежде всего, я рекомендую вам прочитать документы PyQt, ссылающиеся на Qt Designer .

Что касается проблемы, Qt Designer не предоставляет виджет, а класс, который служит интерфейсомв виджет, и это можно увидеть в его заявлении:

class Ui_gen_settings(object):
    # ...

Класс наследует от объекта, а не от QWidget, QDialog, QMainWindow и т. д.

В документах, которые указывают изначальноРекомендуется создать виджет и использовать интерфейс, предоставленный Qt Designer.Для этого правильно использовать pyuic, но я заменим gen_settings.py на gen_settings_ui.py, чтобы изменения были понятны.

pyuic5 gen_settings.ui -o gen_settings_ui.py

Итак, теперь мы создадим файл с именем gen_settings.py, который содержит виджети используйте интерфейс.

gen_settings.py

from gen_settings_ui import Ui_gen_settings
from PyQt5 import QtWidgets


class Gen_Settings(QtWidgets.QWidget, Ui_gen_settings):
    def __init__(self, parent=None):
        super(Gen_Settings, self).__init__(parent)
        self.setupUi(self)

Затем, когда вы создаете .ui, соответствующий Ui_MainWindow, вы добавляете QWidget, который является пустымконтейнер.

enter image description here

enter image description here

На изображении контейнер виджета - тот, который находится ввверху слева, и теперь мы заменим его на Gen_Settings, поэтому мы должны продвинуть , используя следующую процедуру:

  1. Щелкните правой кнопкой мыши контейнер виджетов и выберите параметр Promote To ....

enter image description here

Следующий диалог появится и заполнит поля, как показано на рисунке (я предполагаю, что gen_settings_ui.py и gen_settings.py находятся в той же папке, что и текущий .ui)

enter image description here

Вы нажимаете кнопку Add, а затем кнопку Promote.

Затем вы преобразуете .ui в .py с помощью pyuic, и вы получите следующее:

from PyQt5 import QtCore, QtGui, QtWidgets

class Ui_MainWindow(object):
    def setupUi(self, MainWindow):
        MainWindow.setObjectName("MainWindow")
        # ...
        self.widget = Gen_Settings(self.centralwidget)
        self.widget.setObjectName("widget")
        self.gridLayout.addWidget(self.widget, 0, 0, 1, 1)
        # ...

from gen_settings import Gen_Settings
...