PyQt在发出QStandardItemMod时崩溃

2024-10-06 15:24:37 发布

您现在位置:Python中文网/ 问答频道 /正文

我通过一个信号将模型从非GUI线程发送到GUI线程,以便创建QTableView并设置模型。不幸的是,应用程序崩溃了。在设置QTableView之前,当我在diagram类中发出字典和准备模型时,一切都是有效的。我做错什么了?我使用的是python3.4和PyQt 5.4.1。在

以下是代码片段:

class CheckNE(QObject):

    #some code ...

    neTreeForEnvAlmsChanged = pyqtSignal(QStandardItemModel, QStandardItemModel)

    def check_bts_envalms(self, modelEnvBscAlm):  # i call it from other CheckNE member function

        #some code, i'm creating modelEnvBtsAlm here...

        print('Before emitting neTreeForEnvAlmsChanged')
        self.neTreeForEnvAlmsChanged.emit(modelEnvBtsAlm, modelEnvBscAlm)
        print('After emitting neTreeForEnvAlmsChanged')


class MainWindow(QMainWindow):

    #some code ...

    @pyqtSlot(QStandardItemModel, QStandardItemModel)
    def retrieveTreeForEnvAlm(self, modelBtsEnv, modelBscEnv):
        print('Receiving neTreeForEnvAlmsChanged')

        dialogTableWorker = TableDialog(modelBtsEnv, modelBscEnv)
        print('Before showing dialog')
        dialogTableWorker.show_table_dialog()
        print('After showing dialog')


class TableDialog(QDialog, Ui_Dialog_Table):
    def __init__(self, modelBts, modelBsc):
        print('Beginning init of TableDialog')
        super(TableDialog, self).__init__()
        self.setupUi(self)
        self.tableView.setModel(modelBts)  # tableView created in Qt Designer
        print('Ending init of TableDialog')

    def show_table_dialog(self):
        print('Showing TableDialog started')
        self.exec_()
        print('Showing TableDialog ended')


def main():

    app = QApplication(sys.argv)

    main_window = MainWindow()
    checkNeWorker = CheckNE()
    checkNeWorkerThread = QThread()

    main_window.show()
    main_window.raise_()

    checkNeWorker.moveToThread(checkNeWorkerThread)
    checkNeWorker.neTreeForEnvAlmsChanged.connect(main_window.retrieveTreeForEnvAlm)
    checkNeWorkerThread.start()

    app.exec_()

main()

结果:

^{pr2}$

但当我在调试中使用断点时:

print('Before emitting neTreeForEnvAlmsChanged')

每件事都很有魅力:

Before emitting neTreeForEnvAlmsChanged
Receiving neTreeForEnvAlmsChanged
Beginning init of TableDialog
After emitting neTreeForEnvAlmsChanged
Ending init of TableDialog
Before showing dialog
Showing TableDialog started
Showing TableDialog ended
After showing dialog

Tags: ofselfinitmaindefdialogprintafter
1条回答
网友
1楼 · 发布于 2024-10-06 15:24:37
当你声明信号和时隙时,你需要引用这些类型,因为它们不是Python类型,但是它们是C++级别定义的。正如文档所说:定义信号的C++签名的类型。每种类型都可以是Python类型对象,或者是C++类型的字符串。

pyqtSignal('QStandardItemModel', 'QStandardItemModel')

以及

^{pr2}$

应该能解决你的问题。在

相关问题 更多 >