python - 难以正确显示 PyQt GUI 元素

标签 python pyqt pyqt5

这里是新的 Python 程序员。我正在尝试制作一个简单的 GUI,但无法显示 PyQt 元素之一。也许这里有人可以给我指出正确的方向并给出一些一般的代码注释。不用担心。我知道我的代码可能很糟糕。我们都必须从某个地方开始。

我有一个 GUI,它由 HBoxLayout 中的两个小部件组成。一个小部件是一个简单的 PushButton,另一个是自定义的 ControlWidget。我可以让它们很好地显示(尽管存在对齐问题)。在 ControlWidget 上,我有一个带有一些标签、组合框和子类 QTextBrowser(调试器)的 GridLayout。这是我无法出现的。

诚然,我不太确定如何做到这一点。传承有错吗?我需要向下层类(Class)传递其他东西吗?我希望将各种元素分解为单独的文件,以便将来的事件可以在代码的其他部分中访问,但显然我遗漏了一些东西。

MainGUI.py

import sys
from PyQt5.QtWidgets import *
from PyQt5.QtGui import *
from PyQt5.QtCore import *

from ControlWidget import ControlWidget
# from MenuBar import MenuBar
from Debugger import Debugger

# Main 
class TopWindow(QMainWindow):
    def __init__(self):
        super(TopWindow, self).__init__()
        self.setWindowTitle('Test GUI')
        self.setGeometry(0, 0, 800, 600)
        self.setMaximumSize(1024, 768)
        self.initUI()

    def initUI(self):
        # MenuBar.initMenuBar(self)
        centralWidget = QWidget(self)
        self.setCentralWidget(centralWidget)
        hLayout = QHBoxLayout(centralWidget)
        pushButton = QPushButton("Button A")
        hLayout.addWidget(pushButton)
        hLayout.addWidget(ControlWidget())

        self.show()

# Program Entry Point        
if __name__ == '__main__':
    applicationInstance = QApplication(sys.argv)
    ex = TopWindow()
    sys.exit(applicationInstance.exec_())

ControlWidget.py

import sys
from PyQt5.QtWidgets import *
from PyQt5.QtGui import * 
from PyQt5.QtCore import *

from Debugger import Debugger

class ControlWidget(QWidget):
    def __init__(self, parent=None):
        super(ControlWidget, self).__init__(parent)
        self.left = 100
        self.top = 100
        self.width = 320
        self.height = 100
        self.numClicks = 0
        self.setMaximumWidth(240) 
        self.setSizePolicy(QSizePolicy.Fixed, QSizePolicy.Fixed)
        self.initUI()

    def initUI(self):
        self.setGeometry(self.left, self.top, self.width, self.height)

        self.createGridLayout()

    def createGridLayout(self):
        # Create Grid Layout
        layout = QGridLayout()
        self.setLayout(layout)
        layout.setColumnStretch(0, 2)
        layout.setColumnStretch(1, 3)
        layout.setColumnStretch(2, 1)

        # Instantiate Labels
        labelA = QLabel()
        labelB = QLabel()
        labelC = QLabel()
        labelD = QLabel()
        labelE = QLabel()
        labelF = QLabel()
        self.labelFa = QLabel()
        labelA.setAlignment(Qt.AlignRight | Qt.AlignVCenter)
        labelB.setAlignment(Qt.AlignRight | Qt.AlignVCenter)
        labelC.setAlignment(Qt.AlignRight | Qt.AlignVCenter)
        labelD.setAlignment(Qt.AlignRight | Qt.AlignVCenter)
        labelE.setAlignment(Qt.AlignRight | Qt.AlignVCenter)
        labelF.setAlignment(Qt.AlignRight | Qt.AlignVCenter)
        self.labelFa.setAlignment(Qt.AlignCenter | Qt.AlignVCenter)
        labelA.setText('ABCD: ')
        labelB.setText('BCDE: ')
        labelC.setText('CDEF: ')
        labelD.setText('DEFG: ')
        labelE.setText('EFGH: ')
        labelF.setText('FGHI: ')

        # Instantiate Combo Boxes
        comboBoxA = QComboBox()
        comboBoxB = QComboBox()
        comboBoxC = QComboBox()
        comboBoxD = QComboBox()
        comboBoxE = QComboBox()
        comboBoxA.addItems(["A", "B", "C", "D"])
        comboBoxB.addItems(["B", "C", "D", "E"])
        comboBoxC.addItems(["C", "D", "E", "F"])
        comboBoxD.addItems(["D", "E", "F", "G"])
        comboBoxE.addItems(["E", "F", "G", "H"])

        # Instantiate Push Buttons
        pushButtonF = QPushButton()
        pushButtonF.setText('Set Value')

        # Spacer
        spacer = QSpacerItem(10, 30, QSizePolicy.Fixed, QSizePolicy.Fixed)

        # Message Box
        labelDebug = QLabel()
        labelDebug.setText("Debug")
        labelDebug.setAlignment(Qt.AlignLeft | Qt.AlignVCenter)
        debug = Debugger(self) # DOES NOT WORK

        # Add to Grid Layout (item, row, column, rowspan, colspan)
        layout.addWidget(labelA, 0, 0)
        layout.addWidget(labelB, 1, 0)
        layout.addWidget(labelC, 2, 0)
        layout.addWidget(labelD, 3, 0)
        layout.addWidget(labelE, 4, 0)
        layout.addWidget(labelF, 5, 0)
        layout.addWidget(comboBoxA, 0, 1, 1, 2)
        layout.addWidget(comboBoxB, 1, 1, 1, 2)
        layout.addWidget(comboBoxC, 2, 1, 1, 2)
        layout.addWidget(comboBoxD, 3, 1, 1, 2)
        layout.addWidget(comboBoxE, 4, 1, 1, 2)
        layout.addWidget(pushButtonF, 5, 1, 1, 1)
        layout.addWidget(self.labelFa, 5, 2, 1, 1)
        layout.addItem(spacer, 6, 0, 1, 3)
        layout.addWidget(labelDebug, 7, 0)
        layout.addWidget(debug, 8, 0)

        # Hook Up ComboBox Signals to Handlers
        comboBoxA.currentIndexChanged.connect(self.comboBoxAHandler)

        # Hook Up PushButton Signals to Handlers
        pushButtonF.clicked.connect(self.pushButtonFHandler)

        #self.horizontalGroupBox.setLayout(layout)

    def comboBoxAHandler(self, i):
        print('Combo Box A Selection Changed to {0}'.format(i))
        #Debugger.write(self, 'Combo Box A Selection Changed')

    def pushButtonFHandler(self):
        print('Push Button F Clicked')
        self.numClicks = self.numClicks + 1
        self.labelFa.setText(str(self.numClicks))

调试器.py

import sys
from PyQt5.QtWidgets import *
from PyQt5.QtGui import * 
from PyQt5.QtCore import *

class Debugger(QWidget):
    def __init__(self, parent=None):
        super(Debugger, self).__init__(parent)
        self.setMaximumWidth(240)
        self.setSizePolicy(QSizePolicy.Fixed, QSizePolicy.Expanding)
        self.createTextBrowser()

    def createTextBrowser(self):
        self.textBrowser = QTextBrowser()
        self.textBrowser.setReadOnly(True)

    def write(self, text):
        self.textBrowser.append("• " + text)

我遗漏或做得不正确的简单事情是什么?

最佳答案

您有 2 个错误:

  • 您在 Debugger 中使用的不是继承,而是组合。

  • 如果您要在同一类的其他方法中使用变量,则必须使该变量成为该类的成员。

考虑到上述情况,解决方案是:

调试器.py

import sys
from PyQt5.QtWidgets import QTextBrowser, QSizePolicy

class Debugger(QTextBrowser):
    def __init__(self, parent=None):
        super(Debugger, self).__init__(parent)
        self.setMaximumWidth(240)
        self.setSizePolicy(QSizePolicy.Fixed, QSizePolicy.Expanding)
        self.setReadOnly(True)

    def write(self, text):
        self.append("• " + text)

ControlWidget.py


# ...
class ControlWidget(QWidget):
    # ...

    def initUI(self):
        # ...

        # Message Box
        labelDebug = QLabel()
        labelDebug.setText("Debug")
        labelDebug.setAlignment(Qt.AlignLeft | Qt.AlignVCenter)
        self.debug = Debugger() # <---

        # ...
        layout.addWidget(labelDebug, 7, 0)
        layout.addWidget(self.debug, 8, 0) # <---

        # Hook Up ComboBox Signals to Handlers
        # ...

    def comboBoxAHandler(self, i):
        print('Combo Box A Selection Changed to {0}'.format(i))
        self.debug.write('Combo Box A Selection Changed') # <---
    # ...
<小时/>

<子> 我建议您阅读以下出版物,以便您了解继承(is-a)和组合(has-a)之间的区别:

关于python - 难以正确显示 PyQt GUI 元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55770196/

相关文章:

python - 如何在 Python 中使用递归反转列表?

python - 读取非常大的 blob 而无需在 Google Cloud 中下载它们(流媒体?)

python - 缩小图像

python - 如何创建正确跨越多个页面的可打印列表

python - 作为本地实例化类的方法的插槽永远不会被调用

java - Android:如何以编程方式检测 Android 设备中的谷歌登录弹出窗口

Python Sqlite3 和 QSqlite 区别

python - 在 QTableView 中使用 QSortFilterProxyModel 对两行进行排序

python - 在 PyQt5 中获取滚动条拇指的大小/宽度?

python - Python 法语词典