Python 2.7 PyQt4 将主窗口文件添加到另一个主窗口的选项卡

Posted

技术标签:

【中文标题】Python 2.7 PyQt4 将主窗口文件添加到另一个主窗口的选项卡【英文标题】:Python 2.7 PyQt4 Add Main Window File to Tab of Another Main Window 【发布时间】:2016-11-12 04:12:37 【问题描述】:

我正在使用 Python 2.7 创建一个程序,并且遇到了一个问题,在 Google 和论坛上搜索了数小时都没有回答。

我的程序由一个名为 sessions_window.py 的 Main_Window 组成,其中包含一个 Tab Widget。在每个选项卡中,应该包含一个单独的主窗口文件。例如,sessions_window.py 的一个选项卡是帐户选项卡,我有另一个包含帐户信息的 acount1.py 文件,我想将其嵌入到帐户选项卡中(是的,我知道我拼写了帐户“acount”,我稍后会修复)。另一个选项卡将被称为 Graph,并且应该包含另一个 Graph.py 文件(尽管我还没有达到这一点)。

*作为说明,我根据索引/描述系统命名了我的元素,所以它们有点长而且很时髦,但它对我有帮助。

我已经成功创建了这些文件,但我坚持将它们嵌入到 session_window.py 选项卡中。

from PyQt4.QtCore import *
from PyQt4.QtGui import *

import acount1

class Ui_BxSession(object):

  def configurePageB(self, BxSession):

        self.accountTabImport = acount1.Ui_MainWindow

# B : Session Page
        BxSession.setObjectName("BxSession")
        BxSession.resize(800, 600)

# B_cn1 : Main Space Container

        self.B_cn1xMainSpace = QWidget(BxSession)
        self.B_cn1xMainSpace.setObjectName("B_cn1xMainSpace")

        self.gridLayout_MainB = QGridLayout(self.B_cn1xMainSpace)
        self.gridLayout_MainB.setObjectName("gridLayout_MainB")

        BxSession.setCentralWidget(self.B_cn1xMainSpace)

# B_cn1_cn1 : Tab Window Space Container

        self.B_cn1_cn1xTabWindowSpace = QTabWidget(self.B_cn1xMainSpace)
        self.B_cn1_cn1xTabWindowSpace.setObjectName("B_cn1_cn1xTabWindowSpace")

        self.gridLayout_MainB.addWidget(self.B_cn1_cn1xTabWindowSpace)

# B_cn1_cn1_tb1 : Account Tab

        self.B_cn1_cn1_tb1xAccount = QWidget(self.B_cn1_cn1xTabWindowSpace)
        self.B_cn1_cn1_tb1xAccount.setObjectName("B_cn1_cn1_tb1xAccount")

        self.B_cn1_cn1xTabWindowSpace.addTab(self.B_cn1_cn1_tb1xAccount, "Account")

        self.gridLayout_AccountTab = QGridLayout(self.B_cn1_cn1_tb1xAccount)
        self.gridLayout_AccountTab.setObjectName("gridLayout_AccountTab")



        self.gridLayout_AccountTab.addWidget(self.accountTabImport)



# B_cn1_cn1_tb2 : Session Tab

        self.B_cn1_cn1_tb2xSession1 = QWidget(self.B_cn1_cn1xTabWindowSpace)
        self.B_cn1_cn1_tb2xSession1.setObjectName("B_cn1_cn1_tb2xSession1")

        self.B_cn1_cn1xTabWindowSpace.addTab(self.B_cn1_cn1_tb2xSession1, "Session")

### rest of code left out

if __name__ == "__main__":
import sys
app = QApplication(sys.argv)
BxSession = QMainWindow()
ui = Ui_BxSession()
ui.configurePageB(BxSession)
BxSession.show()
sys.exit(app.exec_())

我已导入文件,为选项卡创建了一个网格,并尝试将小部件添加到网格。但我收到以下错误。

C:\Python27\python.exe "C:/Users/smiths/Desktop/App      Project/AppDev_2/rewritecode/program/session_window.py"
Traceback (most recent call last):
File "C:/Users/smiths/Desktop/App  Project/AppDev_2/rewritecode/program/session_window.py", line 139, in <module>
ui.configurePageB(BxSession)
File "C:/Users/smiths/Desktop/App  Project/AppDev_2/rewritecode/program/session_window.py", line 50, in configurePageB
self.gridLayout_AccountTab.addWidget(self.accountTabImport)
TypeError: arguments did not match any overloaded call:
QGridLayout.addWidget(QWidget): argument 1 has unexpected type 'type'
QGridLayout.addWidget(QWidget, int, int, Qt.Alignment alignment=0): argument  1 has unexpected type 'type'
QGridLayout.addWidget(QWidget, int, int, int, int, Qt.Alignment alignment=0): argument 1 has unexpected type 'type'

Process finished with exit code 1

我也试过了

self.accountTabImport = acount1.Ui_MainWindow()

同样的错误信息。

我也尝试跳过上面的定义,只包含

self.gridLayout_AccountTab.addWidget(acount1.Ui_MainWindow).

同样的错误。

acount1.py 包含一个包含一堆函数的类。看不出有必要在此处包含它,但如果需要,请告诉我。任何帮助将不胜感激。

【问题讨论】:

【参考方案1】:

你需要先实例化类(从类中创建一个对象/实例)

self.accountTabImport = acount1.Ui_MainWindow()

(注意最后的括号)

请注意,您可能还需要为上述调用提供参数,具体取决于 Ui_MainWindow.__init__ 的方法签名中的内容

【讨论】:

以上是关于Python 2.7 PyQt4 将主窗口文件添加到另一个主窗口的选项卡的主要内容,如果未能解决你的问题,请参考以下文章

PyQt4消息窗口

pycharm + pyqt4编写图形用户界面环境搭建

python笔记 PyQt4初学随笔[1基础类的介绍]

win7搭建pyqt4开发环境

无法使用 Python 2.7、PyQt 4.11 和 Windows 7 64 位为 QFileDialog 设置默认过滤器

Python PyQt4 关闭应用程序