PyQt5-QPushButton.pressed()信号/插槽未更新QLabel小部件

时间:2019-02-18 17:19:52

标签: python python-3.x qt pyqt5 signals-slots

作为一个相当新的Python和Qt程序员,这是我的第一个问题。我试图找到一种解决方案,但运气不佳(我可能只是错误地提出了这个问题)。

我产生了以下代码,希望可以帮助证明我的问题:

import sys
from PyQt5 import QtWidgets

class MainWindow(QtWidgets.QMainWindow):

    def __init__(self):
        QtWidgets.QMainWindow.__init__(self)
        self.resize(410, 131)
        self.setWindowTitle("Test")

        self.centralWidget = QtWidgets.QWidget(self)
        self.setCentralWidget(self.centralWidget)
        self.gridLayout = QtWidgets.QGridLayout(self.centralWidget)
        self.centralWidget.setLayout(self.gridLayout)

        self.mainButton = QtWidgets.QPushButton("Main", self)
        self.altButton = QtWidgets.QPushButton("Alt", self)
        self.radioButton = QtWidgets.QRadioButton("Main/Alt", self)
        self.label = QtWidgets.QLabel("Label", self)

        self.gridLayout.addWidget(self.mainButton, 0, 0)
        self.gridLayout.addWidget(self.altButton, 0, 1)
        self.gridLayout.addWidget(self.label, 0, 3)
        self.gridLayout.addWidget(self.radioButton, 1, 0)


def setMain():
    print("Main is chosen")
    ui.label.setText("Main is chosen")
    # ui.label.update()

def setAlt():
    print("Alt is chosen")
    ui.label.setText("Alt is chosen")
    # ui.label.update()

def setToggle(btn):
    if btn.isChecked():
        setMain()
    else:
        setAlt()

app = QtWidgets.QApplication(sys.argv)
ui = MainWindow()

ui.mainButton.pressed.connect(lambda: setMain())
ui.altButton.pressed.connect(lambda: setAlt())
ui.radioButton.toggled.connect(lambda: setToggle(ui.radioButton))

ui.show()
sys.exit(app.exec_())

如果我运行上面的代码,则“ Main”和“ Alt”按钮不会像我期望的那样更新QLabel小部件。但是,QRadioButton似乎可以正常工作。

我发现,如果在两次按键之间调整窗口大小,标签会重新绘制自身。如果我使用QButton.clicked()信号而不是QButton.pressed()信号,则标签将在大约80%的时间内更新。正如您希望在控制台中看到的那样,两种类型的信号/插槽均一致地调用这些函数,这似乎是受影响的QLabel小部件的重画。

我看过的所有地方都建议这样做,所以我有些困惑。我在Mac OSX 10.14.2的PyCharm IDE中运行Python 3.5。任何帮助解释这种行为以及如何克服它的帮助将不胜感激。预先非常感谢。

0 个答案:

没有答案