首页 > 解决方案 > PyQt5 - 具有相同对象的选项卡

问题描述

所以我不想为任何选项卡使用布局。我将使用 .setGeometry 来放置对象,因为要放置许多对象 :)

问题是:在 Tab1.py 和 Tab2.py 中创建的任何对象都出现在所有选项卡上。

我相信问题出在父/子代码上,但不确定我是否出错了。任何指导将不胜感激。 你也可以忽略一些导入,我只是还没有得到那个代码:)

主窗口.py

import os, sys, subprocess, atexit, PyQt5, pyodbc, time, datetime, getpass, csv, xlsxwriter
import Tab1, Tab2, Tab3

from PyQt5.QtWidgets import QApplication, QTabBar, QLayout, QLabel, QLineEdit, QMainWindow, QTabWidget, QWidget, QPushButton, QHBoxLayout, QVBoxLayout, QGroupBox, QRadioButton, QTextEdit, QCheckBox, QInputDialog, QFileDialog, QProgressBar, QTableWidget, QTableWidgetItem
from PyQt5.QtCore import *

class MainWindow(QMainWindow):

    # define main window size and position on screen
    def __init__(MainWindow, parent=None):
        super().__init__()

        MainWindow.left = 50
        MainWindow.top = 50
        MainWindow.width = 720
        MainWindow.height = 600
        MainWindow.setGeometry(MainWindow.left,
                               MainWindow.top,
                               MainWindow.width,
                               MainWindow.height)

        MainWindow.table_widget = MainWindowWidget(MainWindow)
        MainWindow.setCentralWidget(MainWindow.table_widget)

        MainWindowWidget()


class MainWindowWidget(QWidget):

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

        # configure layout
        self.layout = QVBoxLayout(self)
        self.setLayout(self.layout)

        # initialize tab screen
        self.tabs = QTabWidget()
        self.tab1 = QWidget()
        self.tab2 = QWidget()
        self.tab3 = QWidget()
        self.layout.addWidget(self.tabs)

        # add tabs
        self.tabs.addTab(self.tab1, "Tab1")
        self.tabs.addTab(self.tab2, "Tab2")
        self.tabs.addTab(self.tab2, "Tab3")

        # create first tab
        Tab1.Tab1.CreateTab1(self)
        Tab2.Tab2.CreateTab2(self)
        Tab3.Tab3.CreateTab3(self)


    def exit_handler(self):
        print('closing application')
        atexit.register(exit_handler(self))


# create main window and show it
if __name__ == '__main__':
    app = QApplication(sys.argv)
    MainWindow = MainWindow()
    MainWindow.show()
    sys.exit(app.exec_())

Tab1.py

from PyQt5.QtWidgets import QApplication, QLabel, QLineEdit, QMainWindow, QTabWidget, QWidget, QPushButton, QHBoxLayout, \
    QVBoxLayout, QGroupBox, QRadioButton, QTextEdit, QCheckBox, QInputDialog, QFileDialog, QProgressBar, QTableWidget, \
    QTableWidgetItem, QComboBox

import MainWindow

class Tab1(QMainWindow):

    def CreateTab1(tab1, parent=None):

        # reference number input box
        tab1.label_input_reference_number = QLabel(tab1)
        tab1.label_input_reference_number.setText('Reference Number')
        tab1.label_input_reference_number.setGeometry(25, 80, 115, 20)

        tab1.input_reference_number = QLineEdit(tab1)
        tab1.input_reference_number.setGeometry(170, 80, 215, 20)

        # add CheckGroupButton
        tab1.Button = QPushButton(tab1)
        tab1.Button.setText("Button")
        tab1.Button.setGeometry(385, 105, 100, 20)

选项卡2.py

from PyQt5.QtWidgets import QApplication, QLabel, QLineEdit, QMainWindow, QTabWidget, QWidget, QPushButton, QHBoxLayout, QGroupBox, QRadioButton, QTextEdit, QCheckBox, QInputDialog, QFileDialog, QProgressBar, QTableWidget, QTableWidgetItem

class Tab2(QMainWindow):

    def CreateTab2(tab2):

        # add button
        tab2.Button = QPushButton(tab2)
        tab2.Button.setText("Another button")
        tab2.Button.setGeometry(300, 585, 100, 20)

标签: pythonpyqt5

解决方案


你的问题在这里:

        self.tabs.addTab(self.tab1, "Tab1")
        self.tabs.addTab(self.tab2, "Tab2")
        self.tabs.addTab(self.tab2, "Tab3")

        # create first tab
        Tab1.Tab1.CreateTab1(self)
        Tab2.Tab2.CreateTab2(self)
        Tab3.Tab3.CreateTab3(self)

您拥有由父级拥有的所有选项卡控件。(另外,你有两次 tab2 。)你想要:

        self.tabs.addTab(self.tab1, "Tab1")
        self.tabs.addTab(self.tab2, "Tab2")
        self.tabs.addTab(self.tab3, "Tab3")

        Tab1.Tab1.CreateTab1(tab1)
        Tab2.Tab2.CreateTab2(tab2)
        Tab3.Tab3.CreateTab3(tab3)

但是,这是一种奇怪的方法。你应该有Tab1Tab2Tab3从 QWidget 派生,并这样做:

        self.tab1 = Tab1.Tab1()
        self.tab2 = Tab2.Tab2()
        self.tab3 = Tab3.Tab3()

这样,你就不需要一个奇怪的类方法来配置东西了。


推荐阅读