1

QPointer関連していない別のオブジェクトからオブジェクトメソッドにアクセスするために使用すると、奇妙な問題が発生します。

よりよく説明するために、小さな例を用意しました。

QWidgetシンプルに Widget_A と Widget_B の2 つを作成しましたQDialog

Widget_B から Widget_A の public メソッドにアクセスする必要があります。割り当てのために、widget_a のポインターを widget_b のメソッドに渡しましQPointerた。Widget_A には、QLineEditWidget_B からクリアしたい が含まれています。

問題は、pushButton_B を押しても lineEdit_A に何も起こらないことです。コンソールには問題が表示されないため、最も明白な理由は、Widget_B が、私が渡したオブジェクトではなく、別の Widget_A オブジェクトで動作していることです。

QWidget_A から QWidget_B への接続も作成したので、lineEdit_A を編集すると、label_B テキストがそれに応じて変更されます。これは機能します。

質問する前QPointerに、実際のプロジェクトでは Widget_A が削除される可能性があるため、 が必要です。どこが間違っているのか説明してもらえますか? 別の方法を選択する必要がありますか? ありがとう。いくつかのスニペットに従ってください

widget_a.h

class Widget_A : public QWidget
{
    Q_OBJECT

public:
    explicit Widget_A(QWidget *parent = 0);
    ~Widget_A();

    void clearLineEdit_A();

signals:
    void lineEdit_A_changed(const QString &);

private slots:
    void on_lineEdit_A_textChanged(const QString &arg1);

private:
    Ui::Widget_A *ui;
};

widget_a.cpp

Widget_A::Widget_A(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::Widget_A)
{
    ui->setupUi(this);
    ui->lineEdit_A->setText("write something here...");
    ui->lineEdit_A->selectAll();
}

Widget_A::~Widget_A()
{
    delete ui;
}

void Widget_A::clearLineEdit_A()
{
    ui->lineEdit_A->clear();
}

void Widget_A::on_lineEdit_A_textChanged(const QString &arg1)
{
    emit lineEdit_A_changed(arg1);
}

widget_b.h

class Widget_B : public QWidget
{
    Q_OBJECT

public:
    explicit Widget_B(QWidget *parent = 0);
    ~Widget_B();

    void controlWidget(QWidget *w);

private slots:
    void changeLabel_B(const QString &text);

    void on_pushButton_B_clicked();

private:
    Ui::Widget_B *ui;
    QPointer<QWidget> qPtrWdgt;
};

widget_b.cpp

Widget_B::Widget_B(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::Widget_B)
{
    ui->setupUi(this);
}

Widget_B::~Widget_B()
{
    delete ui;
}

void Widget_B::controlWidget(QWidget *w)
{
    qPtrWdgt = w;
    connect(qPtrWdgt, SIGNAL(lineEdit_A_changed(const QString &)),
                  this, SLOT(changeLabel_B(const QString &)));
}

void Widget_B::changeLabel_B(const QString &text)
{
    ui->label_B->setText(text);
}

void Widget_B::on_pushButton_B_clicked()
{
    Widget_A(qPtrWdgt).clearLineEdit_A();
}

dialog.h

class Dialog : public QDialog
{
    Q_OBJECT

public:
    explicit Dialog(QWidget *parent = 0);
    ~Dialog();

private:
    Ui::Dialog *ui;

    Widget_A *widget_a;
    Widget_B *widget_b;
};

ダイアログ.cpp

Dialog::Dialog(QWidget *parent) :
    QDialog(parent),
    ui(new Ui::Dialog)
{
    ui->setupUi(this);

    widget_a = new Widget_A(this);
    widget_b = new Widget_B(this);
    widget_b->controlWidget(widget_a);

    QVBoxLayout *mainLayout = new QVBoxLayout(this);
    mainLayout->addWidget(widget_a);
    mainLayout->addWidget(widget_b);
    setLayout(mainLayout);
}
4

1 に答える 1

0
Widget_A(qPtrWdgt).clearLineEdit_A();

Widget_Aこれは、コンストラクターを使用してnew を作成しWidget_A(QWidget *)、それを呼び出しますclearLineEdit_A()

代わりにqPtrWdgtasを定義する場合、およびoverloads以来、次を使用できます。QPointer<Widget_A>QPointeroperator->

qPtrWdgt->clearLineEdit_A();

Widget_Aのヘッダーものヘッダーに含める必要がありますWidget_B

于 2012-12-09T11:48:55.870 に答える