簡體   English   中英

Pyqt5崩潰,沒有錯誤,特別是我雙擊鼠標左鍵(雙擊鼠標右鍵起作用)

[英]Pyqt5 Crashes without error when i specifically double left click (double right works)

我正在用Python創建該應用程序,該應用程序與Outlook進行通訊,並檢索有關每個文件夾中的郵件數量以及其他內容的一些數據,而我使用的是PyQt5。

但是當我給函數分配信號時,發生了一些奇怪的事情:

self.table_widget.itemDoubleClicked.connect(self.some_function)

如果我右鍵單擊此項目,一切運行正常。 但是,如果我用左鍵單擊它,它會凍結,然后崩潰而沒有任何錯誤屏幕(通常,如果您執行該程序,當它崩潰時,您可以在后面的控制台上看到一些堆棧,對嗎?在這種情況下,字面意思是什么都沒有顯示)。

我不確定我是否正在使用他表示正確的信號,所以可能有什么...?

無論如何,由於沒有發生錯誤,所以我嘗試放置一些打印件以查看崩潰的地方,但是事實證明t2屏幕加載的很好,並且當代碼返回主循環時顯然崩潰了……? 我不知道,我無法調試這些東西。

我將僅在此處放置基本代碼,以便更容易發現錯誤,但如果不夠,我可以顯示一些詳細信息。

編輯

根據要求,我在下面做了一個最小的可復制示例,它確實以相同的方式崩潰:

from PyQt5.QtCore import QDateTime, Qt, QTimer, pyqtSignal
from PyQt5.QtWidgets import QApplication, QMainWindow, QDialog, QTableWidgetItem
from PyQt5 import uic
import sys, os

class t0(QMainWindow):

    switch_window = pyqtSignal()

    def __init__(self):
        super(t0, self).__init__()
        uic.loadUi(Controller.application_path + r'\UI\t0.ui', self)
        #This .ui file has pretty much a button to click
        self.btn_ok.clicked.connect(self.onButtonClick1)

    def onButtonClick1(self):
        self.switch_window.emit()


class t1(QDialog):    

    switch_window = pyqtSignal()

    def __init__(self, parent=None):
        super(t1, self).__init__(parent)
        uic.loadUi(Controller.application_path + r'\UI\t1.ui', self)
        #This .ui file has a QTableWidget

        self.tw_indi.setColumnCount(1)
        self.tw_indi.setRowCount(1)
        self.tw_indi.setItem(0, 0, QTableWidgetItem("*"))

        self.tw_indi.itemDoubleClicked.connect(self.direcionar_detalhes)


    def direcionar_detalhes(self, item):
        self.switch_window.emit()

class t2(QDialog): 

    switch_window = pyqtSignal(str)

    def __init__(self, parent=None):
        super(t2, self).__init__(parent)
        uic.loadUi(Controller.application_path + r'\UI\t2.ui', self)
        #This .ui file is identical as the t1.ui, just some minor changes        


class Controller():


    controller = None
    #questões técnicas do módulo os com pyinstaller
    if getattr(sys, 'frozen', False):
        application_path = sys.exec_prefix
    else:
        application_path = os.path.dirname(os.path.abspath(__file__))

    tela = None
    app = QApplication(sys.argv)

    def __init__(self):       
        Controller.controller = self
        self.mostra_carregamento()

        sys.exit(Controller.app.exec_())

    def mostra_carregamento(self):
        self.view = t0()
        self.view.switch_window.connect(self.mostra_indicador)
        self.view.show()    
    def mostra_indicador(self):
        self.view.close()
        self.view = t1()
        self.view.switch_window.connect(self.sinal_indicador)
        self.view.show()

    def sinal_indicador(self): 
        self.view.close()
        self.view = t2()
        self.view.show()

if __name__ == '__main__':
    control = Controller()

編輯2

這是用戶界面的鏈接: https : //drive.google.com/file/d/1-iFNaWUGtJ4687nTcTFtb7WRKUL37als/view? usp =drivesdk

問題不在於信號,而是當您想在新窗口中重用同一變量時,您將消除仍可見並因此正在運行的對象的內存,從而產生未保留的內存訪問。 解決方案是使用不同的變量名:

class Controller:
    # ...
    def mostra_carregamento(self):
        self.view0 = t0()
        self.view0.switch_window.connect(self.mostra_indicador)
        self.view0.show()

    def mostra_indicador(self):
        self.view0.close()
        self.view1 = t1()
        self.view1.switch_window.connect(self.sinal_indicador)
        self.view1.show()

    def sinal_indicador(self):
        self.view1.close()
        self.view2 = t2()
        self.view2.show()

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM