在Qt 4.8中,我试图在一个类中获取一个信号以与MainWindow中的一个插槽通信,并且在代码执行时,我没有得到所需的结果。 我有两个连接语句,一个将MainWindow中的信号连接到ser中的一个插槽。第一个连接语句正常工作并在ser中执行testprint()(它在运行时停在那里的断点)。第二个连接用于Ser中的信号到MainWindow中的插槽。但是,第二次连接不起作用,因为我没有执行testprint和printtext的信号。
这是什么问题?为什么ser不发出信号? 问候, 詹姆斯
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()), j, SLOT(testprint()));
// connect testsignal from ser to printtext on MainWindow
connect(j,
SIGNAL(testsignal),
this,
SLOT(printtext(const QByteArray &data)));
}
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);
emit click();
}
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();
MainWindow * myMain;
private slots:
void on_pushButton_clicked();
public slots:
void printtext(const QByteArray &data);
private:
Ui::MainWindow *ui;
signals:
void click();
};
#endif // MAINWINDOW_H
ser.cpp
#include "ser.h"
#include "mainwindow.h"
#include <QObject>
ser::ser(QObject *parent) :
QObject(parent)
{
}
void ser::init()
{
}
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 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
答案 0 :(得分:2)
在您的代码中: -
connect(j,
SIGNAL(testsignal),
this,
SLOT(printtext(const QByteArray& data)));
你在testignal之后缺少参数,所以它应该是SIGNAL(testsignal(const QByteArray&amp;))。此外,无法命名参数,因此请删除插槽中的“数据”。
请注意,connect函数返回一种QMetaObject :: Connection,您可以测试它。如果它返回NULL,则表示没有建立连接。
此外,当代码在connect函数上运行时,调试器输出窗口通常会告诉您连接是否失败。
答案 1 :(得分:1)
此行错误
connect(j,
SIGNAL(testsignal),
this,
SLOT(printtext(const QByteArray &data)));
您需要指定如下信号参数:
connect(j, SIGNAL(testsignal(QByteArray)), this, SLOT(printtext(QByteArray)));
请注意,您不需要提供参数名称(例如const QByteArray &data
),只需输入即可。此外,connect
方法返回bool
结果,因此您可以检查其结果,以确保完成所有连接。当连接失败时,您还可以检查调试输出以获取详细的错误信息
答案 2 :(得分:1)
您的SIGNAL
和SLOT
参数略有混淆。
connect(j,
SIGNAL(testsignal),
this,
SLOT(printtext(const QByteArray &data)));
在此声明中,您遗漏了两件事,您需要在testsignal
之后使用括号,testsignal
也会发送数据,因此它应该显示SIGNAL(testsignal(const QByteArray &))
,并在您的插槽中您不要仅将变量名称设置为数据类型。所以它应该是SLOT(printtext(const QByteArray &))
。