2

Qt 4.8 では、MainWindow のスロットと通信するために 1 つのクラスでシグナルを取得しようとしていますが、コードの実行中に目的の結果が得られません。2 つの connect ステートメントがあり、1 つは MainWindow のシグナルを ser のスロットに接続します。最初の connect ステートメントは正常に動作し、ser で testprint() を実行しています (実行時にブレークポイントで停止します)。2 番目の接続は、MainWindow のスロットに接続された信号用です。ただし、testprint からの信号がなく、printtext が 1 回だけ実行されるため、この 2 番目の接続は機能しません。

ここでの問題は何ですか?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
4

3 に答える 3

2

あなたのコードで: -

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

testsignal の後にパラメーターが欠落しているため、SIGNAL(testsignal(const QByteArray&)) である必要があります。また、パラメーターに名前を付けることができないため、スロットの「data」を削除します。

connect 関数は、テストできる QMetaObject::Connection のタイプを返すことに注意してください。NULL を返す場合、接続は確立されていません。

また、コードが接続関数を介して実行されると、通常、接続が失敗したかどうかがデバッガーの出力ウィンドウに表示されます。

于 2013-06-28T09:27:21.773 に答える
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結果を返すため、すべての接続が完了したことを確認するために結果を確認できます。接続に失敗した場合は、デバッグ出力で詳細なエラー情報を確認することもできます

于 2013-06-28T09:29:13.253 に答える
1

SIGNALSLOTパラメータが少し混同されています。

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

このステートメントでは、次の 2 つの点が欠落しています。 の後testsignalに括弧が必要です。また、testsignalデータを送信するため、 を読み取る必要がSIGNAL(testsignal(const QByteArray &))あります。また、スロットには変数名だけを入れず、データ型を指定します。だからそれは読むべきSLOT(printtext(const QByteArray &))です。

于 2013-06-28T09:29:39.227 に答える