Добавить программно в окно, созданное pyuic из файла пользовательского интерфейса qt-designer - PullRequest
0 голосов
/ 03 мая 2019

Я посмотрел на ответ на этот предыдущий вопрос «Доступ к объектам QT Designer программным способом». Это вопрос, который я задаю, но этот ответ просто перекодирует окно без ссылки на модуль, сгенерированный pyuic. Итак, можно ли создать пустое окно в qt-designer, его файле pyuic, а затем манипулировать этим окном, добавляя виджеты и т. Д. Из вашего собственного класса python. Если это возможно, может кто-нибудь указать мне пример? Спасибо

мой .ui

<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
 <class>mainWindow</class>
 <widget class="QMainWindow" name="mainWindow">
  <property name="geometry">
   <rect>
    <x>0</x>
    <y>0</y>
    <width>800</width>
    <height>600</height>
   </rect>
  </property>
  <property name="windowTitle">
   <string/>
  </property>
  <widget class="QWidget" name="centralwidget">
   <widget class="QLabel" name="label">
    <property name="geometry">
     <rect>
      <x>80</x>
      <y>60</y>
      <width>161</width>
      <height>51</height>
     </rect>
    </property>
    <property name="frameShape">
     <enum>QFrame::Box</enum>
    </property>
    <property name="lineWidth">
     <number>3</number>
    </property>
    <property name="text">
     <string>TextLabel</string>
    </property>
   </widget>
  </widget>
  <widget class="QMenuBar" name="menubar">
   <property name="geometry">
    <rect>
     <x>0</x>
     <y>0</y>
     <width>800</width>
     <height>26</height>
    </rect>
   </property>
  </widget>
  <widget class="QStatusBar" name="statusbar"/>
 </widget>
 <resources/>
 <connections/>
</ui>
from mydesign import Ui_mainWindow

class mywindow(QtWidgets.QMainWindow):

    def __init__(self):

        super(mywindow, self).__init__()

        self.ui = Ui_mainWindow()

        self.ui.setupUi(self)

        pixmap = QPixmap('image.jpeg')
        pixmap = pixmap.scaledToHeight(500)
        self.ui.label.setPixmap(pixmap)
        self.resize(pixmap.width(),pixmap.height())
        pixmap = pixmap.scaledToWidth(64)

        #I want to add this widget to window in Ui_mainWindow - Is this possible?
        #This code produces a separate SVG window. 
        self.ui.svgWidget = QSvgWidget('GT.svg')
        self.ui.svgWidget.setGeometry(0,0,730,300)
        self.ui.svgWidget.show()


app = QtWidgets.QApplication([])

application = mywindow()

application.show()

sys.exit(app.exec())

1 Ответ

1 голос
/ 03 мая 2019

Чтобы добавить что-то, вы должны знать, куда оно будет добавлено, предполагая, что .ui - это пустой дизайн:

*. Ui

<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
 <class>MainWindow</class>
 <widget class="QMainWindow" name="MainWindow">
  <property name="geometry">
   <rect>
    <x>0</x>
    <y>0</y>
    <width>800</width>
    <height>600</height>
   </rect>
  </property>
  <property name="windowTitle">
   <string>MainWindow</string>
  </property>
  <widget class="QWidget" name="centralwidget"/>
  <widget class="QMenuBar" name="menubar">
   <property name="geometry">
    <rect>
     <x>0</x>
     <y>0</y>
     <width>800</width>
     <height>23</height>
    </rect>
   </property>
  </widget>
  <widget class="QStatusBar" name="statusbar"/>
 </widget>
 <resources/>
 <connections/>
</ui>

Затем вы конвертируете это в.py с помощью pyuic:

pyuic5 foo_filename.ui -o design.py -x

Учитывая вышесказанное, нет необходимости добавлять что-либо в Ui_mainWindow, поскольку это не виджет, это класс, который используется для заполнения виджета, поэтомучто вам нужно сделать, это добавить его в окно.В этом случае, поскольку это QMainWindow, вы должны использовать центральный виджет:

from PyQt5 import QtCore, QtGui, QtWidgets, QtSvg

from design import Ui_MainWindow


class MainWindow(QtWidgets.QMainWindow, Ui_MainWindow):
    def __init__(self, parent=None):
        super(MainWindow, self).__init__(parent)
        self.setupUi(self)
        self.label = QtWidgets.QLabel()
        pixmap = QtGui.QPixmap("image.jpeg")
        pixmap = pixmap.scaledToHeight(500)
        self.label.setPixmap(pixmap)
        self.svgWidget = QtSvg.QSvgWidget("GT.svg")

        lay = QtWidgets.QVBoxLayout(self.centralWidget())
        lay.addWidget(self.label)
        lay.addWidget(self.svgWidget)


if __name__ == "__main__":
    import sys

    app = QtWidgets.QApplication(sys.argv)
    w = MainWindow()
    w.show()
    sys.exit(app.exec_())

Обновление

Поскольку вы предоставили .ui, решение будет изменено.Для отображения виджета в окне это должен быть дочерний элемент окна или дочерний элемент в окне, в этом случае используется центральный виджет.

from PyQt5 import QtCore, QtGui, QtWidgets, QtSvg

from design import Ui_mainWindow


class MainWindow(QtWidgets.QMainWindow, Ui_mainWindow):
    def __init__(self, parent=None):
        super(MainWindow, self).__init__(parent)
        self.setupUi(self)
        pixmap = QtGui.QPixmap("image.jpeg")
        pixmap = pixmap.scaledToHeight(500)
        self.label.setPixmap(pixmap)
        self.svgWidget = QtSvg.QSvgWidget("GT.svg", parent=self.centralWidget())
        self.svgWidget.setGeometry(0, 0, 730, 300)


if __name__ == "__main__":
    import sys

    app = QtWidgets.QApplication(sys.argv)
    w = MainWindow()
    w.show()
    sys.exit(app.exec_())
...