2016-07-27 126 views
-1

我在QT框架中的信號和插槽中有問題。 我的插槽不工作。 這裏是代碼。QT中的信號和插槽

 connect(&th,SIGNAL(change()),this,SLOT(closeWindow())); 
     this->moveToThread(th); 
     closeWindow(); 
     th.start(); 

「日」 是這樣的類變種:

class Thread : public QThread 
    { 
    public : 
     Thread(); 
     bool pause,flag; 
     QString URL; 
     QFile *mFile; 
     void run(); 
     void RESUME(); 
     void PAUSE(); 
     bool Check(); 
     bool Check2(); 
    signals: 
     void change(); 
     QString myTxt; 
    }; 

「變」 是信號

,這裏是我的主窗口的代碼:

 namespace Ui { 
    class MainWindow; 
    } 
    class MainWindow : public QMainWindow 
    { 
Q_OBJECT 
    public: 
     explicit MainWindow(QWidget *parent = 0); 
     ~MainWindow(); 
     Thread th; 
    private slots: 
     void on_pushButton_clicked(); 
    private: 
     Ui::MainWindow *ui; 
    public slots: 
     void closeWindow(); 
    }; 

這裏是MainWindow的構造函數

 MainWindow::MainWindow(QWidget *parent) : 
     QMainWindow(parent), 
     ui(new Ui::MainWindow) 
    { 
     ui->setupUi(this); 
     connect(&th,SIGNAL(change()),this,SLOT(closeWindow())); 
     th.start(); 
    } 

信號正常。但插槽不工作。 你能指導我嗎?

+0

我們不能在你的代碼中的信號發射看到(我們甚至看不到*如果*它發出的)。您的第一個片段無法工作:變量th是一個對象,moveToThread將一個指針作爲參數。請提供[MCVE](https://www.google.fr/url?sa=t&rct=j&q=&esrc=s&source=web&cd=1&cad=rja&uact=8&ved=0ahUKEwjt8d_-vJPOAhVPahoKHdeFBPUQFggeMAA&url=http%3A%2F%2Fstackoverflow.com %2Fhelp%2Fmcve與USG = AFQjCNEkKReghNZHBJSaky_hwPskMmG0ww&SIG2 = qJFt1v76F13Ikk_8pOIvMQ) – wasthishelpful

+0

我發送的信號,現在你@wasthishelpful – sass

+0

時是發出它的信號的工作(我的測試,並寫一些代碼到它,並且他們跑酷)@wasthishelpful – sass

回答

1

我認爲主要的問題是接收對象存在於死線程中。

您的Thread實例位於應用程序線程上,而您的MainWindow位於您的Thread實例創建的線程上。但是,如您已重新實現QThread::run(),則此線程上沒有事件循環,並且該插槽永遠不會被調用。有關詳細信息,

檢查Qt文檔:


你也需要在你的代碼中的一些重大問題:

  • 缺少Q_OBJEC T宏定義在Thread定義中(但您可能在複製/粘貼時刪除了它,否則您將無法發出信號)。
  • 您不得致電moveToThread()來自QWidget(例如QMainWindow)。 QWidgets必須存在於應用程序線程中。
  • 您一般不能混合使用moveToThread()並重新實​​現run()
    • 當使用moveToThread()時,您正在使用線程事件循環來使QObject生活在此線程上(即移至此線程)。
    • 當重新實現QThread::run()時,人們通常希望在線程上執行單個函數。這將導致線程被創建,函數被執行並且線程被銷燬而不運行事件循環。沒有事件循環意味着如果一個QObject駐留在這個線程上,它將不會收到線程間插槽調用。

注:使用moveToThread()是使用QThread正確/預期的方式。重新實現QThread::run()將工作,可以在Qt文檔中找到,但通常不推薦使用,你可能更好使用QThreadPool

更多閱讀:http://blog.qt.io/blog/2010/06/17/youre-doing-it-wrong/