QPointer
関連していない別のオブジェクトからオブジェクトメソッドにアクセスするために使用すると、奇妙な問題が発生します。
よりよく説明するために、小さな例を用意しました。
QWidget
シンプルに Widget_A と Widget_B の2 つを作成しましたQDialog
。
Widget_B から Widget_A の public メソッドにアクセスする必要があります。割り当てのために、widget_a のポインターを widget_b のメソッドに渡しましQPointer
た。Widget_A には、QLineEdit
Widget_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);
}