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 Заголовок тоже.

Другие вопросы по тегам