2013-04-10 45 views
0

mainwindow.h:需要幫助從螺紋連接信號GUI到插槽

#ifndef MAINWINDOW_H 
#define MAINWINDOW_H 

#include <QMainWindow> 

namespace Ui { 
class MainWindow; 
} 

class MainWindow : public QMainWindow 
{ 
    Q_OBJECT 

public: 
    explicit MainWindow(QWidget *parent = 0); 
    ~MainWindow(); 

private slots: 
    void disableStartButton(); 

private: 
    Ui::MainWindow *ui; 
}; 

#endif // MAINWINDOW_H 

myobject.h

#ifndef MYOBJECT_H 
#define MYOBJECT_H 

#include <QtCore> 

class MyObject : public QObject 
{ 
    Q_OBJECT 
public: 
    explicit MyObject(QObject *parent = 0); 
    void doSetup(QThread &cThread); 

signals: 
    void disableStartButton(); 

public slots: 
    void doWork();  

}; 

#endif // MYOBJECT_H 

main.cpp中:

#include "mainwindow.h" 
#include "myobject.h" 
#include <QApplication> 

int main(int argc, char *argv[]) 
{ 
    QApplication a(argc, argv); 
    MainWindow w; 
    w.show(); 

    QThread cThread; 
    MyObject cObject; 
    cObject.doSetup(cThread); 
    cObject.moveToThread(&cThread); 

    return a.exec(); 
} 

mainwindow.cpp:

#include "mainwindow.h" 
#include "ui_mainwindow.h" 

MainWindow::MainWindow(QWidget *parent) : 
    QMainWindow(parent), 
    ui(new Ui::MainWindow) 
{ 
    ui->setupUi(this); 
} 

MainWindow::~MainWindow() 
{ 
    delete ui; 
} 

void MainWindow::disableStartButton() { 
    ui->pushButton->setEnabled(false); 
} 

myobject.h:

#include "myobject.h" 
#include <QDebug> 

MyObject::MyObject(QObject *parent) : 
    QObject(parent) 
{ 
} 

void MyObject::doSetup(QThread &cThread) 
{ 
    connect(&cThread, SIGNAL(started()), this, SLOT(doWork())); 
    connect(ui->pushButton, SIGNAL(clicked()), &cThread, SLOT(start())); // (1) 
    connect(this, SIGNAL(disableStartButton()), ui, SLOT(disableStartButton())); // (2) 
} 

void MyObject::doWork() 
{ 
    emit disableStartButton(); 
    qDebug() << "1"; 
} 

我試圖做兩件事情。

(1):儘快pushButton被點擊,我希望cThread啓動。

(2):只要cThread啓動,它就會:emit disableStartButton();。我想在mainwindow.cpp中將disableStartButton()連接到disableStartButton()。

對於(1),I得到這個錯誤:

myobject.cpp:12:錯誤:C2065: 'UI':未聲明的標識符

回答

1

當然,還有UI是未定義的。您嘗試在文件myobject.cpp,連接ui->pushButton

connect(ui->pushButton, SIGNAL(clicked()), &cThread, SLOT(start())); // (1) 

當你的用戶界面只在mainwindow.cpp 你有按鈕連接到mainwindow.cpp文件中的線程,希望幫助

通過聲明順便說一下,你應該在main.cpp不創建對象,但是,在你的情況下,在mainwindow.cpp,動線

QThread cThread; 
MyObject cObject; 
cObject.doSetup(cThread); 
cObject.moveToThread(&cThread); 

到文件中構造mainwindow.cpp,例如

MainWindow::MainWindow(QWidget *parent) : 
QMainWindow(parent), 
ui(new Ui::MainWindow) 
{ 
    ui->setupUi(this); 
} 

right after ui->setupUi(this);