Как я могу получить доступ к содержимому виджета вне конструктора? - PullRequest
0 голосов
/ 15 апреля 2019

Я хочу отобразить содержимое, которое я написал в виджете QLineEdit после нажатия на QPushButton с функцией ShowMessage ().Как я могу получить доступ к этому содержимому вне конструктора?

Попытка поместить созданный мной объект QLineEdit в личную переменную.

Мой файл CPP

#include "manualwidget.h"
#include <QLabel>
#include <QLineEdit>
#include <QPushButton>
#include <QHBoxLayout>
#include <QMessageBox>

ManualWidget::ManualWidget(QWidget *parent) : QWidget(parent)
{
    QLabel *label = new QLabel(this);
    QLineEdit *lineEdit = new QLineEdit(this);
    QPushButton *pushButton = new QPushButton(this);
    QHBoxLayout *layout = new QHBoxLayout();

    label->setText("Enter text:");
    pushButton->setText("Ok");
    layout->addWidget(label);
    layout->addWidget(lineEdit);
    layout->addWidget(pushButton);

    setLayout(layout);

    connect(pushButton,SIGNAL(clicked()),this ,SLOT(showMessage()));
    connect(lineEdit, SIGNAL(returnPressed()),this, SLOT(showMessage()));


}

void ManualWidget::showMessage(){

    QMessageBox::information(this, "Message", "The text entered in the "
     "manual widget window is:\n" + m_lineEdit->text());

}

Мой заголовокфайл

#ifndef MANUALWIDGET_H
#define MANUALWIDGET_H

#include <QWidget>
#include <QLineEdit>

class ManualWidget : public QWidget
{
    Q_OBJECT
public:
    explicit ManualWidget(QWidget *parent = nullptr);

signals:


public slots:

private slots:
    void showMessage();
private:
    QLineEdit m_lineEdit;
};

#endif // MANUALWIDGET_H

1 Ответ

0 голосов
/ 16 апреля 2019

@ eyllanesc предложение может работать, но оно не должно быть предпочтительным подходом.У Qt есть своя собственная модель памяти, и ее использование должно быть предпочтительным.Таким образом, «QLineEdit m_lineEdit» следует изменить, например, на «QLineEdit * m_lineEdit», и в конструкторе вы должны инициализировать его следующим образом:

// Instance of the QLineEdit will be owned by the ManualWidget which is part of Qt memory management now.
m_lineEdit = new QLineEdit(this);

Затем следующая строка:

layout->addWidget(lineEdit);

Может быть изменено на:

layout->addWidget(m_lineEdit);

Почему плохо использовать «QLineEdit m_lineEdit»?Поскольку Qt может захотеть уничтожить этот объект по какой-то причине (вы все равно можете вызвать m_lineEdit.deleteLater ()), и вы можете оказаться в ситуации «двойного уничтожения», которая приведет к сбою приложения.Вы можете сказать, что таким образом конфликтующие модели памяти будут взаимодействовать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...