C++,Qt信号和插槽
我想了解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
你的方法作为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)));
它被插入到另一个连接语句之后。 这不会打印出预期消息“Slong”。它也不会给我任何错误!问题是什么? James
'*'的格式不是一个论坛,其中的后续问题显示为帖子。相反,它是一个问题答案网站:一个问题,然后(可能是多个)答案。如果你需要更多的信息,那么正确的做法是开一个新的问题。此外,如果您的问题得到解答,您应该用一个复选标记标记(“接受”)最好/最有帮助的答案,以表明您的问题已解决。 – tmpearce
谢谢,那是一个愚蠢的错误。 – jas99
好的,我解决了这个问题,并且向MainWindow.cpp添加了一条连接语句。错误来自* connect *语句。 >/home/user/QTProjects/stest1/stest1/mainwindow。cpp:14:error:expected >在''之前的主表达式,'令牌 我找不出发件人应该是什么。任何人都可以指导我两个连接语句应该是什么? James – jas99
你应该在'connect'中使用你的对象'j'。您正在尝试使用类名“ser”代替。 –