先看main.cpp文件: 就是定義一個線程
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
MainWindow w;
w.show();
/*定義一個線程,並且啟動一個線程*/
MyThread receive_data;
receive_data.start();
return a.exec();
}
然後在mainwindow.h 文件中,定義了該線程的類,同時在mainwindow類中定義了一個槽函數,在mythread中定義了一個信號
class MainWindow : public QMainWindow {
Q_OBJECT
public:
MainWindow(QWidget *parent = 0);
~MainWindow();
protected:
void changeEvent(QEvent *e);
private:
Ui::MainWindow *ui;
public slots:
void print(); //我的槽函數
private slots:
void on_pushButton_clicked();
};
/*創建一個線程類*/
class MyThread : public QThread
{
Q_OBJECT
public:
virtual void run();
signals:
void UpdateSignal(); //我定義的類
};
然後再mainwindow.h中實現了槽函數,並在線程中循環發送信號:
/*一個線程的主函數*/
void MyThread::run()
{
while(1)
{
//開啟一個死循環,每隔一秒就發送一個信號
qDebug("hello");
Sleep(1000);
emit UpdateSignal();
}
}
void MainWindow::print()
{
ui->label->setText("hello"); //槽函數的實現,就是不執行
}
結果:編譯也沒有問題,但是槽函數就是不執行,到底是什麼原因?
對了,在mainwindow的構造函數中,進行了連接
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
MyThread thread_1;
connect(&thread_1, SIGNAL(UpdateSignal()),
this, SLOT(print()));
}
這是我全部的代碼,就是不行
1、main方法裡的receive_data雖然啟動了,但並沒有將它的信號和MainWindow中的槽函數關聯;
2、MainWindow構造函數中實例化了另一個線程 thread_1,並關聯了信號和槽,但 thread_1並沒有啟動;
根本原因:1和2中是同一類型的兩個實例,是兩個線程!