【问题标题】:Qt connect class to MainWindowQt 将类连接到 MainWindow
【发布时间】:2013-06-28 09:21:50
【问题描述】:

在 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

【问题讨论】:

  • 鉴于以下所有正确答案,还值得指出的是,如果您将 qWarnings 输出到控制台,您可能会看到一条错误消息,指出没有匹配的信号槽。因为函数签名不匹配。编译时不检查信号/插槽。

标签: c++ qt


【解决方案1】:

在您的代码中:-

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

你在 testsignal 之后缺少参数,所以它应该是 SIGNAL(testsignal(const QByteArray&))。另外,参数不能命名,所以删除槽中的“数据”。

请注意,connect 函数返回一个 QMetaObject::Connection 类型,您可以对其进行测试。如果返回 NULL,则表示未建立连接。

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

【讨论】:

  • 或者只是 printtext(QByteArray)
  • const QByteArray& 和 QByteArray 是不同的类型。
  • 哪个调试器窗口?我找不到提供连接信息的人!
  • 这可能取决于您使用的操作系统,但对我而言,无论是 Windows (Visual Studio) 还是 OSX (Qt Creator),输出窗口都会显示未找到的连接。它可能只是在调试版本上,但我猜你还是在使用它。此外,如果您在终端环境中从命令行运行您的应用程序,它也应该在那里发生。
【解决方案2】:

这行写错了

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

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

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

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

【讨论】:

    【解决方案3】:

    您的SIGNALSLOT 参数略有混淆。

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

    在这个语句中你缺少两件事,你需要testsignal之后的括号,而且testsignal会发送数据,所以它应该是SIGNAL(testsignal(const QByteArray &amp;)),并且在你的插槽中你不要放变量名只有数据类型。所以它应该是SLOT(printtext(const QByteArray &amp;))

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多