【问题标题】:buttonClicked signal of QMessageBox isn't workingQMessageBox 的 buttonClicked 信号不起作用
【发布时间】:2018-02-16 12:48:26
【问题描述】:

我想使用Qmessagebox 来显示有关正在运行的计算的一些信息,并在我单击“确定”按钮时作为停止功能。 但是,当我使用信号 buttonClicked 时,什么都没有发生,并且永远不会调用与它连接的 hte 函数

这里有一个代码来说明我的问题:

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

class SenderObject(QObject):
    something_happened = pyqtSignal( )

class myfunc():
    updateTime = SenderObject()
    def __init__(self):
        self.i = 0
        self.stop = True
    def run(self):
        while self.stop :
            self.i+=1
            if self.i%100 == 0:
                self.updateTime.something_happened.emit()
                print('infinit loop',self.i)


class SurfViewer(QMainWindow):
    def __init__(self, parent=None):
        super(SurfViewer, self).__init__()
        self.parent = parent
        self.setFixedWidth(200)
        self.setFixedHeight(200)
        self.wid = QWidget()
        self.setCentralWidget(self.wid)
        self.groups = QHBoxLayout() ####
        self.Run = QPushButton('Run')
        self.groups.addWidget(self.Run)
        self.wid.setLayout(self.groups)

        self.Run.clicked.connect(self.run)

        self.myfunc = myfunc()
        self.myfunc.updateTime.something_happened.connect(self.updateTime)

    def run(self):
        self.msg = QMessageBox()
        self.msg.setText('Click Ok to stop the loop')
        self.msg.setWindowTitle(" ")
        self.msg.setModal(False)
        self.msg.show()

        self.myfunc.run()
        self.msg.buttonClicked.connect(self.Okpressed)

    def Okpressed(self):
        self.myfunc.stop = False

    @pyqtSlot( )
    def updateTime(self ):
        self.msg.setText('Click Ok to stop the loop\ni = '+str(self.myfunc.i))
        self.parent.processEvents()



if __name__ == '__main__':
    app = QApplication(sys.argv)
    ex = SurfViewer(app)
    ex.setWindowTitle('window')
    ex.show()
    sys.exit(app.exec_( ))  

所以self.msg.buttonClicked.connect(self.Okpressed) 行永远不会调用函数Okpressed。因此,myfunc.run 永远不会停止。 有人可以帮忙吗?

【问题讨论】:

    标签: python pyqt connect buttonclick qmessagebox


    【解决方案1】:

    self.msg.buttonClicked.connect(self.Okpressed)
    

    之前

    self.myfunc.run()
    

    如果在订阅 click 事件之前调用 run 函数,curse 会陷入无限的 while 循环。所以你的点击事件永远不会订阅。

    先订阅点击事件,然后调用“myfunc”的“run”函数

    是的,永远不要这样做 -

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

    它的 vbad 编程实践。你可以这样写

    from PyQt4 import QtGui
    

    并在代码中使用

    QtGui.QMessagebox
    

    【讨论】:

    • 好的,谢谢,我明白了。为什么我不应该做这些导入?
    • python 编码指南的链接。 python.org/dev/peps/pep-0008这将帮助您了解python语法和正确的编码方式。
    猜你喜欢
    • 1970-01-01
    • 2021-04-21
    • 2015-01-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多