[英]C++, Qt Signals & slots
我試圖了解Qt 4.8信號和插槽,所以我寫了一些代碼自己測試。 最終,我希望能夠在項目中使用公共源文件,以便可以從項目中的任何源文件訪問串行端口。
我設置了一個Qt GUI應用程序,並添加了一個C ++類頭文件和源文件,如下所示。
當我嘗試構建時,在嘗試發出信號時收到錯誤消息。
/home/user/QTProjects/stest1/stest1/ser.cpp:25:錯誤:在非成員函數中無效使用了“ this”
我什至還沒有進入建立連接的階段!
我的新手狀態很明顯,我將不勝感激。
謝謝,詹姆斯
以下是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
您的方法實現為void testprint() { ... }
,但應為void ser::testprint() { ... }
。 它在您的cpp文件中。
還要注意,您不需要使用this->
來引用類成員。 emit testsignal(ba1);
會很好的。
我認為應該是
connect (this, SIGNAL(click()), j, SLOT(testprint()));
代替
connect (this, SIGNAL(click()), ser, SLOT(testprint()));
除此之外,我無法發現您在哪里連接testsignal
很好,可以。 connect (this, SIGNAL(click()), j, SLOT(testprint()));
我的下一個問題是將ser中的信號連接到MainWindow中的插槽。 我用了
connect(j,
SIGNAL(testsignal),
this,
SLOT(printtext(const QByteArray &data)));
它是在另一個connect語句之后立即插入的。 這不會打印出預期的消息“ Slong”。 它也不會給我任何錯誤! 問題是什么? 詹姆士
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.