首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在PyQt5中,在弹出QMessageBox后,新父级处于不同的q线程中。

在PyQt5中,在弹出QMessageBox后,新父级处于不同的q线程中。
EN

Stack Overflow用户
提问于 2018-11-10 11:55:31
回答 1查看 2K关注 0票数 1

这是PyQt5代码。我要倒数5秒,每1秒更新一次。然后应用程序将弹出QMessageBox。

但由于QMessageBox的原因,它将在单击QObject::setParent: Cannot set parent, new parent is in a different thread按钮后关闭,

详细代码如下:

代码语言:javascript
运行
复制
from PyQt5 import QtCore, QtGui, QtWidgets
import sys, time
from _thread import *

class ThreadClass(QtCore.QThread):
    # Create the signal
    sig = QtCore.pyqtSignal(int)

    def __init__(self, mw, parent=None):
        self.mw = mw
        self.mbox = QtWidgets.QMessageBox()
        super().__init__(parent)
        self.sig.connect(self.showtime)

    def showtime(self, t):
        self.mw.label.setText(str(t))

    def run(self):
        for t in range(5):
            self.sig.emit(t)
            time.sleep(1)
        self.mbox.about(QtWidgets.QMainWindow(), "Title", "Finished")

class Ui_MainWindow(object):
    def setupUi(self, MainWindow):
        MainWindow.setObjectName("MainWindow")
        MainWindow.resize(253, 181)
        self.centralwidget = QtWidgets.QWidget(MainWindow)
        self.centralwidget.setObjectName("centralwidget")
        self.pushButton = QtWidgets.QPushButton(self.centralwidget)
        self.pushButton.setGeometry(QtCore.QRect(90, 100, 75, 23))
        self.pushButton.setObjectName("pushButton")
        self.label = QtWidgets.QLabel(self.centralwidget)
        self.label.setGeometry(QtCore.QRect(20, 20, 211, 16))
        self.label.setObjectName("label")
        self.tc = ThreadClass(self)
        self.pushButton.clicked.connect(lambda: self.tc.start())
        #self.pushButton.clicked.connect(lambda: start_new_thread(showtime, (self.label, )))
        MainWindow.setCentralWidget(self.centralwidget)


        QtCore.QMetaObject.connectSlotsByName(MainWindow)
        self.pushButton.setText("Show")
        self.label.setText("Time")         

if __name__ == '__main__':
    app = QtWidgets.QApplication(sys.argv)
    ex = Ui_MainWindow()
    w = QtWidgets.QMainWindow()
    ex.setupUi(w)
    w.show()
    sys.exit(app.exec_())

在QMessageBox上点击按钮和下面的错误信息之后,App将关闭。

代码语言:javascript
运行
复制
QBasicTimer::stop: Failed. Possibly trying to stop from a different thread
QBasicTimer::stop: Failed. Possibly trying to stop from a different thread
QBasicTimer::stop: Failed. Possibly trying to stop from a different thread
QBasicTimer::stop: Failed. Possibly trying to stop from a different thread
QObject::setParent: Cannot set parent, new parent is in a different thread
QObject::setParent: Cannot set parent, new parent is in a different thread
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-11-10 12:26:10

试一试:

代码语言:javascript
运行
复制
import sys   #, time
from PyQt5 import QtCore, QtGui, QtWidgets
from _thread import *

class ThreadClass(QtCore.QThread):
    # Create the signal
    sig = QtCore.pyqtSignal(int)
    finish = QtCore.pyqtSignal()                # +++

    def __init__(self, mw, parent=None):
#        self.mw = mw
#        self.mbox = QtWidgets.QMessageBox()
        super().__init__(parent)
#        self.sig.connect(self.showtime)

#    def showtime(self, t):
#        self.mw.label.setText(str(t))

    def run(self):
        for t in range(5):
            self.sig.emit(t)
            #time.sleep(1)
            QtCore.QThread.msleep(1000)

        self.finish.emit()                                             # +++
#        self.mbox.about(QtWidgets.QMainWindow(), "Title", "Finished")

class Ui_MainWindow(object):
    def setupUi(self, MainWindow):
        MainWindow.setObjectName("MainWindow")
        MainWindow.resize(253, 181)
        self.centralwidget = QtWidgets.QWidget(MainWindow)
        self.centralwidget.setObjectName("centralwidget")

        self.pushButton = QtWidgets.QPushButton(self.centralwidget)
        self.pushButton.setGeometry(QtCore.QRect(90, 100, 75, 23))
        self.pushButton.setObjectName("pushButton")

        self.label = QtWidgets.QLabel(self.centralwidget)
        self.label.setGeometry(QtCore.QRect(20, 20, 211, 16))
        self.label.setObjectName("label")

        self.tc = ThreadClass(self)
        self.pushButton.clicked.connect(lambda: self.tc.start())
        #self.pushButton.clicked.connect(lambda: start_new_thread(showtime, (self.label, )))

        self.tc.sig.connect(self.showtime)            # +++
        self.tc.finish.connect(self.finishTime)       # +++


        MainWindow.setCentralWidget(self.centralwidget)


        QtCore.QMetaObject.connectSlotsByName(MainWindow)
        self.pushButton.setText("Show")
        self.label.setText("Time")         

# +++
    def showtime(self, t):
        self.label.setText(str(t)) 

# +++
    def finishTime(self):
        self.mbox = QtWidgets.QMessageBox()
        self.mbox.about(QtWidgets.QMainWindow(), "Title", "Finished")


if __name__ == '__main__':
    app = QtWidgets.QApplication(sys.argv)
    w   = QtWidgets.QMainWindow()
    ex  = Ui_MainWindow()
    ex.setupUi(w)
    w.show()
    sys.exit(app.exec_())

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53238682

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档