QPointer для доступа к объектным методам
Есть странная проблема с использованием QPointer
для доступа к методу объекта из другого, не связанного, объекта.
Я подготовил небольшой пример, чтобы объяснить это лучше.
Я создал два QWidget
, Widget_A и Widget_B в простом QDialog
,
Мне нужно получить доступ из Widget_B к общедоступному методу Widget_A: я передал указатель 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;
};
dialog.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);
}
1 ответ
Widget_A(qPtrWdgt).clearLineEdit_A();
Это создает новый Widget_A
используя Widget_A(QWidget *)
конструктор, затем вызывает clearLineEdit_A()
в теме.
Если вы определите qPtrWdgt
как QPointer<Widget_A>
вместо этого и с QPointer
перегрузки operator->
, тогда вы можете использовать:
qPtrWdgt->clearLineEdit_A();
Вам нужно будет включить Widget_A
Заголовок в Widget_B
Заголовок тоже.