2013-06-26 172 views
0

我想了解Qt 4.8信號和插槽,所以我寫了一些代碼來測試它自己。最終,我希望能夠在我的項目中使用通用的源文件,以便可以從項目中的任何源文件訪問串行端口。C++,Qt信號和插槽

我設置了一個Qt GUI應用程序並添加了一個C++類的頭文件和源文件,如下所示。

當我嘗試構建時,當我嘗試發出信號時收到錯誤消息。

/home/user/QTProjects/stest1/stest1/ser.cpp:25: error: invalid use of 'this' in non-member function

我還沒有到設置連接的階段呢!

我的新手狀態很明顯,我會很感激任何幫助。

謝謝, 詹姆斯


以下是MainWindow.cpp: -

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

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

    ser *j = new ser; 
    j->init(); 

    connect (this, SIGNAL(click()), ser, SLOT(testprint())); 

} 

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

void MainWindow::on_pushButton_clicked() 
{ 
    QByteArray ba1; 

    ba1.resize(6); 
    ba1[0]='H'; ba1[1]='e'; ba1[2]='l'; ba1[3]='l'; ba1[4]='o'; ba1[5]='\n'; 

    this->printtext(ba1); 
} 

void MainWindow::printtext(const QByteArray &data) 
{ 
    ui->textEdit->insertPlainText(QString(data)); 
} 

以下是MainWindow.h

#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 on_pushButton_clicked(); 
    void printtext(const QByteArray &data); 

private: 
    Ui::MainWindow *ui; 

signals: 
// void click; 
}; 

#endif // MAINWINDOW_H 

以下是Ser。 cpp: -

#include "ser.h" 

#include <QObject> 

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

void ser::init() 
{ 

// connect(this->, SIGNAL(testsignal), MainWindow, SLOT(printtext(const QByteArray &data))); 

} 

void ser::testprint() 
{ 
    QByteArray ba1; 

    ba1.resize(8); 
    ba1[0]='S'; ba1[1]= '0'; ba1[2]= ' '; ba1[3]= 'l'; ba1[4]='o'; ba1[5]='n'; ba1[6]='g'; ba1[7]='\n'; 

    emit this->testsignal(ba1); 
} 

以下是ser.h

#ifndef SER_H 
#define SER_H 
#include "mainwindow.h" 

#include <QObject> 

class ser : public QObject 
{ 
    Q_OBJECT 
public: 
    explicit ser(QObject *parent = 0); 

    void init(); 

signals: 
    void testsignal(const QByteArray &data); 

private slots: 
    void testprint(); 


public slots: 


}; 

#endif // SER_H 

回答

2

你的方法作爲void testprint() { ... }實現的,但它應該是void ser::testprint() { ... }。它在你的cpp文件中。

另請注意,您不需要使用this->來引用類成員。 emit testsignal(ba1);將叉罰款。

+0

謝謝,那是一個愚蠢的錯誤。 – jas99

+0

好的,我解決了這個問題,並且向MainWindow.cpp添加了一條連接語句。錯誤來自* connect *語句。 >/home/user/QTProjects/stest1/stest1/mainwindow。cpp:14:error:expected >在''之前的主表達式,'令牌 我找不出發件人應該是什麼。任何人都可以指導我兩個連接語句應該是什麼? James – jas99

+0

你應該在'connect'中使用你的對象'j'。您正在嘗試使用類名「ser」代替。 –

2

我想應該是

connect (this, SIGNAL(click()), j, SLOT(testprint())); 

,而不是

connect (this, SIGNAL(click()), ser, SLOT(testprint())); 

,除了,我不能在這裏你連接testsignal

0

大,該工作發現。 connect (this, SIGNAL(click()), j, SLOT(testprint()));

我的下一個問題是將ser信號連接到MainWindow中的插槽。我用

connect(j, 
     SIGNAL(testsignal), 
     this, 
     SLOT(printtext(const QByteArray &data))); 

它被插入到另一個連接語句之後。 這不會打印出預期消息「Slong」。它也不會給我任何錯誤!問題是什麼? James

+0

'StackOverflow'的格式不是一個論壇,其中的後續問題顯示爲帖子。相反,它是一個問題答案網站:一個問題,然後(可能是多個)答案。如果你需要更多的信息,那麼正確的做法是開一個新的問題。此外,如果您的問題得到解答,您應該用一個複選標記標記(「接受」)最好/最有幫助的答案,以表明您的問題已解決。 – tmpearce