繁体   English   中英

Qt将类连接到MainWindow

[英]Qt connect class to MainWindow

在Qt 4.8中,我试图在一个类中获取与MainWindow中的插槽进行通信的信号,并且在执行代码时,没有得到期望的结果。 我有两个connect语句,一个将MainWindow中的信号连接到ser中的插槽。 第一个connect语句运行良好,并在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

在您的代码中:-

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

在testsignal之后缺少参数,因此它应该是SIGNAL(testsignal(const QByteArray&))。 另外,无法命名参数,因此请删除插槽中的“数据”。

请注意,connect函数返回一种可以测试的QMetaObject :: Connection类型。 如果返回NULL,则表示未建立连接。

同样,当代码在连接函数上运行时,调试器输出窗口通常会告诉您连接是否失败。

这行是错的

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

您需要像这样指定信号参数:

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

请注意,您无需提供参数名称(例如const QByteArray &data ),只需键入即可。 另外, connect方法返回bool结果,因此您可以检查其结果以确保所有连接均已完成。 连接失败时,您还可以检查调试输出以获取详细的错误信息。

您已经将SIGNALSLOT参数稍微混在一起了。

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

在此语句中,您遗漏了两件事,您需要在testsignal之后testsignal括号,并且该testsignal将发送数据,因此它应读取SIGNAL(testsignal(const QByteArray &)) ,并且在您的插槽中不要放置变量仅命名数据类型。 因此,应读取SLOT(printtext(const QByteArray &))

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM