2013-07-18 152 views
0

我已經使用QTimer相當多。但現在它是失敗的,我不明白爲什麼它:在你的CPP文件QTimer不完整類型

#include <QTimer> 

enter image description here

#ifndef MAINWINDOW_H 
#define MAINWINDOW_H 

#include <QMainWindow> 
#include <QtGui/QPushButton> 
#include <QtGui/QTextEdit> 
#include <QtGui/QMessageBox> 
#include <QtCore/QCoreApplication> 

// Server 
#include <sys/socket.h> 
#include <netinet/in.h> 

// Client 
//#include <sys/socket.h> 
//#include <netinet/in.h> 
#include <netdb.h> 


namespace Ui { 
    class MainWindow; 
} 

class MainWindow : public QMainWindow 
{ 
    Q_OBJECT 

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

private: 
    Ui::MainWindow *ui; 
    QPushButton *m_btn1; 
    QPushButton *m_btn2; 
    QTextEdit *m_txt1; 
    QTextEdit *m_txt2; 
    QTimer *timerDisplay; 
    void UpdateDisplay(); 

private slots: 
    void handleBtn1(); 
    void handleBtn2(); 
}; 

#endif // MAINWINDOW_H 

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

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

    m_btn1 = new QPushButton("Start", this); 
    m_btn1->setGeometry(QRect(QPoint(10,20), QSize(100,50))); 
    connect(m_btn1, SIGNAL(released()), this, SLOT(handleBtn1())); 

    m_btn2 = new QPushButton("Send", this); 
    m_btn2->setGeometry(QRect(QPoint(110, 20), QSize(100, 50))); 
    connect(m_btn2, SIGNAL(released()), this, SLOT(handleBtn2())); 

    m_txt1 = new QTextEdit("hello",this); 
    m_txt1->setGeometry(QRect(QPoint(10,100), QSize(300, 50))); 

    timerDisplay = new QTimer(this); 
    connect(timerDisplay, SIGNAL(timeout()), this, SLOT(updateDisplay())); 
    timerDisplay->start(10); 
} 


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

void MainWindow::handleBtn1()//Start 
{ 
    if (1){ 
     QMessageBox *msgBox = new QMessageBox(0); 
     msgBox->setGeometry(QRect(QPoint(200,200),QSize(400,400))); 
     msgBox->setInformativeText(m_txt1->toPlainText()); 

     msgBox->exec(); 
    } 


} 

void MainWindow::handleBtn2()//Send 
{ 

} 


void MainWindow::UpdateDisplay() 
{ 
    static int c = 0; 
    QString strC = "number: " + QString::number(c, 'd', 0); 
    m_txt1 = strC; 
} 
+0

[使用QTimer的問題]的可能重複(https://stackoverflow.com/questions/5961072/problems-with-using-qtimer) – liquide

回答

4

你忘了。符號已知的原因是因爲沿着包含鏈的其他頭部正在執行QTimer的前向聲明,這意味着您可以聲明QTimer指針和引用,但不實際實例化它。

不用說,你不應該依賴那個。相反,更改:

QTimer *timerDisplay; 

到:

class QTimer *timerDisplay; 

,然後#include <QTimer>在cpp文件。

另一個問題是,即使您嘗試將信號連接到它,您的UpdateDisplay()函數也不是插槽。因此,將該函數的聲明移至private slots:部分。

+0

出現的另一個問題是callBack:UpdateDisplay沒有在「插槽「 – jdl

+0

@jdl是的,你需要使它成爲一個插槽。更新答案。 –

+0

用'class'關鍵字聲明對象有什麼區別?正如'class QTimer * timerDisplay' –