Как вставить форму внутри mainWindow - PullRequest
1 голос
/ 08 июля 2019

Я бы хотел отобразить форму на вкладке главного окна. Главное окно уже создано и заполнено пустыми вкладками, а форма также создана и заполнена пустым списком, надписями и т. Д.

Главное окно называется home и Form listInvoice. Они работают хорошо сами по себе, но когда я вызываю listInvoice из домашней вкладки, он открывает новое окно, отображающее графический интерфейс listInvoice вместо отображения listInvoice на вкладке.

Знаете ли вы, как вызвать форму из вкладки главного окна? Спасибо за вашу помощь.

файл home.ui (созданный QT Designer):

<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>500</height>
   </rect>
  </property>
  <property name="windowTitle">
   <string>MainWindow</string>
  </property>
  <widget class="QWidget" name="centralwidget">
   <layout class="QGridLayout" name="gridLayout">
    <item row="0" column="0">
     <widget class="QLabel" name="lDate">
      <property name="text">
       <string>TextLabel</string>
      </property>
     </widget>
    </item>
    <item row="1" column="0">
     <widget class="QTabWidget" name="tabWidget">
      <property name="tabPosition">
       <enum>QTabWidget::West</enum>
      </property>
      <property name="currentIndex">
       <number>0</number>
      </property>
      <property name="elideMode">
       <enum>Qt::ElideNone</enum>
      </property>
      <widget class="QWidget" name="tabHome">
       <attribute name="title">
        <string>Home</string>
       </attribute>
       <layout class="QGridLayout" name="gridLayout_2"/>
      </widget>
      <widget class="QWidget" name="tabCompanies">
       <attribute name="title">
        <string>Companies</string>
       </attribute>
      </widget>
      <widget class="QWidget" name="tabProjects">
       <attribute name="title">
        <string>Projects</string>
       </attribute>
      </widget>
      <widget class="QWidget" name="tabInvoices">
       <attribute name="title">
        <string>Invoices</string>
       </attribute>
      </widget>
     </widget>
    </item>
   </layout>
  </widget>
  <widget class="QStatusBar" name="statusbar"/>
 </widget>
 <resources/>
 <connections/>
</ui>

Домашний класс:

# Class import
from listInvoice import ListInvoice

# GUI manager 
from PyQt5.QtWidgets import QApplication, QComboBox, QDialog, QDialogButtonBox, QFrame, QLabel, QLineEdit, QMainWindow, QMessageBox, QPushButton, QTabWidget, QVBoxLayout,QWidget
from PyQt5.uic import loadUi

# Other imports
import datetime
import sys


class Home(QMainWindow):
    print("home.py")
    def __init__(self):
        super(Home, self).__init__()
        loadUi("home.ui", self)
        self.setWindowTitle("Home")

        # Display current date
        self.lDate.setText(str(datetime.date.today()))

        # Insert widget into tabs
        self.tabInvoices = ListInvoice()


app = QApplication(sys.argv)
widget = Home()
widget.show()
sys.exit(app.exec_())

listInvoice.ui (создан QT Designer):

<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
 <class>Form</class>
 <widget class="QWidget" name="Form">
  <property name="geometry">
   <rect>
    <x>0</x>
    <y>0</y>
    <width>735</width>
    <height>300</height>
   </rect>
  </property>
  <property name="windowTitle">
   <string>Form</string>
  </property>
  <layout class="QGridLayout" name="gridLayout">
   <item row="1" column="0">
    <spacer name="horizontalSpacer">
     <property name="orientation">
      <enum>Qt::Horizontal</enum>
     </property>
     <property name="sizeHint" stdset="0">
      <size>
       <width>40</width>
       <height>20</height>
      </size>
     </property>
    </spacer>
   </item>
   <item row="1" column="2">
    <widget class="QPushButton" name="pbSearch">
     <property name="text">
      <string>Search</string>
     </property>
    </widget>
   </item>
   <item row="4" column="0" colspan="3">
    <spacer name="verticalSpacer">
     <property name="orientation">
      <enum>Qt::Vertical</enum>
     </property>
     <property name="sizeHint" stdset="0">
      <size>
       <width>20</width>
       <height>40</height>
      </size>
     </property>
    </spacer>
   </item>
   <item row="0" column="2">
    <widget class="QPushButton" name="pbAddInvoice">
     <property name="text">
      <string>Add invoice</string>
     </property>
    </widget>
   </item>
   <item row="2" column="0">
    <widget class="QLabel" name="label">
     <property name="text">
      <string>Filter by:</string>
     </property>
    </widget>
   </item>
   <item row="1" column="1">
    <widget class="QLineEdit" name="leSearch"/>
   </item>
   <item row="2" column="1" colspan="2">
    <widget class="QPushButton" name="pbCertified">
     <property name="text">
      <string>To certified</string>
     </property>
     <property name="checkable">
      <bool>true</bool>
     </property>
    </widget>
   </item>
   <item row="3" column="0" colspan="3">
    <widget class="QTableWidget" name="twInvoices"/>
   </item>
  </layout>
 </widget>
 <resources/>
 <connections/>
</ui>

И класс ListInvoice:

class ListInvoice(QDialog):
    print("listInvoice.py")
    def __init__(self):
        super(ListInvoice, self).__init__()
        loadUi("listInvoice.ui", self)
        self.setWindowTitle("Invoices")

Ожидаемый результат должен быть listInvoice на домашней вкладке.

1 Ответ

2 голосов
/ 08 июля 2019

Вы ошибаетесь, считая, что, делая sef.tabInvoices = ListInvoice(), вы заменяете виджет, тогда нет, переменная self.tabInvoices указывает на объект, и когда вы переназначаете его, эта переменная больше не будет указывать на исходный объект, а на другой..

Учитывая вышеизложенное, существует как минимум 2 решения:

1.Используйте макет:

Используйте макет для размещения виджета ListInvoice внутри tabInvoices, он не заменяется, а размещается внутри.

class Home(QMainWindow):
    print("home.py")
    def __init__(self):
        super(Home, self).__init__()
        loadUi("home.ui", self)
        self.setWindowTitle("Home")
        # Display current date
        self.lDate.setText(str(datetime.date.today()))
        # Insert widget into tabs
        self.tabInvoices_w = ListInvoice()  # <---
        lay = QVBoxLayout(self.tabInvoices) # <---
        lay.addWidget(self.tabInvoices_w)   # <---

2.Продвигать виджет

Продвигать ListInvoice с помощью Qt Designer, для получения дополнительной информации вы можете просмотреть следующие ответы:

Учитывая, что решение состоит в том, чтобы изменить home.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>500</height>
   </rect>
  </property>
  <property name="windowTitle">
   <string>MainWindow</string>
  </property>
  <widget class="QWidget" name="centralwidget">
   <layout class="QGridLayout" name="gridLayout">
    <item row="0" column="0">
     <widget class="QLabel" name="lDate">
      <property name="text">
       <string>TextLabel</string>
      </property>
     </widget>
    </item>
    <item row="1" column="0">
     <widget class="QTabWidget" name="tabWidget">
      <property name="tabPosition">
       <enum>QTabWidget::West</enum>
      </property>
      <property name="currentIndex">
       <number>3</number>
      </property>
      <property name="elideMode">
       <enum>Qt::ElideNone</enum>
      </property>
      <widget class="QWidget" name="tabHome">
       <attribute name="title">
        <string>Home</string>
       </attribute>
       <layout class="QGridLayout" name="gridLayout_2"/>
      </widget>
      <widget class="QWidget" name="tabCompanies">
       <attribute name="title">
        <string>Companies</string>
       </attribute>
      </widget>
      <widget class="QWidget" name="tabProjects">
       <attribute name="title">
        <string>Projects</string>
       </attribute>
      </widget>
      <widget class="ListInvoice" name="tabInvoices">
       <attribute name="title">
        <string>Invoices</string>
       </attribute>
      </widget>
     </widget>
    </item>
   </layout>
  </widget>
  <widget class="QStatusBar" name="statusbar"/>
 </widget>
 <customwidgets>
  <customwidget>
   <class>ListInvoice</class>
   <extends>QWidget</extends>
   <header>listInvoice</header>
   <container>1</container>
  </customwidget>
 </customwidgets>
 <resources/>
 <connections/>
</ui>

И удалите self.tabInvoices = ListInvoice() в домашнем классе, так как в этом нет необходимости.

...