0

Qt 4.8 のシグナルとスロットを理解しようとしているので、自分でテストするコードを書きました。最終的には、プロジェクト内の任意のソース ファイルからシリアル ポートにアクセスできるように、プロジェクト内で共通のソース ファイルを使用できるようにしたいと考えています。

Qt GUI アプリケーションをセットアップし、以下に示す C++ クラス ヘッダーとソース ファイルを追加しました。

ビルドしようとすると、シグナルを送信しようとするとエラー メッセージが表示されます。

/home/user/QTProjects/stest1/stest1/ser.cpp:25: エラー: 非メンバー関数での「this」の使用が無効です

まだ接続を設定する段階にさえ達していません!

私の初心者のステータスは明らかです。助けていただければ幸いです。

ありがとう、ジェームズ


以下は 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
4

3 に答える 3

2

あるべきだと思います

connect (this, SIGNAL(click()), j, SLOT(testprint()));

それ以外の

connect (this, SIGNAL(click()), ser, SLOT(testprint()));

それ以外では、どこに接続しているかわかりませんtestsignal

于 2013-06-26T16:59:01.133 に答える
2

あなたのメソッドは として実装されてvoid testprint() { ... }いますが、そうあるべきですvoid ser::testprint() { ... }。それはあなたのcppファイルにあります。

this->また、クラス メンバーを参照するためにを使用する必要がないことにも注意してください。emit testsignal(ba1);うまくフォークします。

于 2013-06-26T14:42:03.780 に答える
0

うまくいきました。 connect (this, SIGNAL(click()), j, SLOT(testprint()));

次の問題は、ser の信号を MainWindow のスロットに接続することです。使った

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

これは、他の connect ステートメントの直後に挿入されました。これは、予期されるメッセージ「Slong」を出力しません。また、エラーも発生しません。何が問題ですか?ジェームズ

于 2013-06-27T10:23:33.490 に答える