首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >PyQt多线程,不能为父级创建子线程。

PyQt多线程,不能为父级创建子线程。
EN

Stack Overflow用户
提问于 2015-10-17 04:00:01
回答 1查看 1.7K关注 0票数 1

我正在使用python 2.7,我遇到了一些与pyqt有关的多线程问题。

我正在尝试读取sqlite文件,并将其内容导入应用程序的主GUI中。

所以我创建了一个线程类

代码语言:javascript
复制
class Thread_OpenSqlite(QtCore.QThread):
    def __init__(self,parent=None):
        super(Thread_OpenSqlite,self).__init__(parent)
    
    def run(self):
        self.emit(QtCore.SIGNAL("open_sqlite()"))

当用户单击menubar打开SQlite文件时,将调用一个函数,创建该线程类的实例并调用该线程。

代码语言:javascript
复制
def selectSQLite(self):
    self.typeflag=4
    self.openpath=QFileDialog.getOpenFileName()
    if os.path.exists(str(self.openpath)):
        #Thread to Open Sqlite
        self.threadopenSqlite=Thread_OpenSqlite()
        self.connect(self.threadopenSqlite, QtCore.SIGNAL("open_sqlite()"), self.sqlOpen, QtCore.Qt.DirectConnection)
        self.threadopenSqlite.start()

在这个sqlOpen()方法中,我访问了sqlite的行,并将数据放在很少的QLabels中,self.ui是我的mainWindow GUI的对象(它包含、重翻译、setupUi等功能)

代码语言:javascript
复制
def sqlOpen(self):
    conn = sqlite3.connect(str(self.openpath))
    print self.openpath
    cursor = conn.cursor()
    try:
        abc=cursor.execute('select some,rows,of,sqlite,to,read,from from general_info limit 0,1')
        for row in abc:
                self.ui.pushButton_2.show()
                self.ui.pushButton_2.setText(str(row[6]))
                self.ui.lineEdit.show()
                self.ui.pushButton_9.show()
                self.ui.label_2.setText(str(row[0]))
                self.ui.label_9.setText(str(row[1]))
                self.ui.label_10.setText(str(row[2]))
                self.ui.label_11.setText(str(row[3]))
                self.ui.label_12.setText(str(row[4]))
                self.ui.label_13.setText(str(row[5]))
                self.ui.label_14.setText(str(row[6]))
                self.ui.label_15.setText(str(row[7]))
                

        conn.close()
    except sqlite3.OperationalError:
        conn.close()

但是,在线程执行之后,我的整个应用程序在回显此错误后会崩溃。

QObject::setParent:无法设置父级,新父级处于不同的线程中 QObject::setParent:无法设置父级,新父级处于不同的线程中 QObject:不能为处于不同线程中的父线程创建子线程。 (父线程为QLabel(0x3315318),父线程为QThread(0x288fa78),当前线程为Thread_OpenSqlite(0x358e3a8)。 QObject:不能为处于不同线程中的父线程创建子线程。(父线程为QTextDocument(0x367d728),父线程为Thread_OpenSqlite(0x358e3A8),当前线程为QThread(0x288fa78) )。

我读过多个pyqt线程和以前的问题,它们有共同之处:

在run方法本身中不能修改主线程中的GUI元素,因此您必须使用信号和插槽机制来发出信号并将其连接到将完成任务的槽。

我也尝试过用QueuedConnection代替DirectConnection,虽然它解决了我的问题,但在退出应用程序时,它显示了python的崩溃弹出,我不想这样做

我还在同一个应用程序中执行了各种多线程操作,以便从GUI元素中放置和获取数据,但这是唯一困扰我的操作。

有人能告诉我上面我哪里错了吗?

提前谢谢。

EN

回答 1

Stack Overflow用户

发布于 2015-10-17 04:23:19

看起来,您的线程代码只是发出一个运行open_sqlite的信号,无论如何,它都将在主线程中运行。而且,它似乎不需要线程这一点。如果您只是填充标签(而不是表),那么您的数据就不是非常动态的,因此您可能不需要在线程中运行它。只需在主线程中运行它,作为程序初始化的一部分或对事件的反应。尽可能避免多线程;打破某些东西(在任何语言或框架中)是出了名的。

如果必须的话,那么使用线程池(本机python或基于Qt的线程池),然后在事件循环中轮询池,直到工作完成为止。工作池更安全,更易于调试和推理。

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

https://stackoverflow.com/questions/33182582

复制
相关文章

相似问题

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