如何从自定义小部件访问小部件?

时间:2016-08-23 13:39:10

标签: c++ qt qwidget qlineedit

如何从自定义小部件中访问小部件?

例如:

我有一个自定义的小部件: enter image description here

现在我有一个"用户信息"将QWidget提升为"我的自定义小部件":

的表单

enter image description here

如何从自定义小部件中获取文本? (例如QLineEdit->text()

3 个答案:

答案 0 :(得分:2)

正确的方法是在MyCustomWidget实施中创建合适的访问者方法:

namespace Ui {
    class MyCustomWidget;
}

class MyCustomWidget : public QWidget
{
    // You may also wish to add WRITE and NOTIFY methods;
    // that's left as an exercise for the reader.
    Q_PROPERTY(QString name READ name)

    const std::unique_ptr<Ui::MyCustomWidget> ui;

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

    QString name() const;
};
#include "ui_mycustomwidget.h"

// Constructor and destructor
MyCustomWidget::MyCustomWidget(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::MyCustomWidget)
{}

MyCustomWidget::~MyCustomWidget() = default;

// Accessor
QString MyCustomWidget::name() const
{
    return ui->nameEdit->text();
}

然后,您可以按正常方式从MyCustomWidget::name()的方法中调用UserInfo方法:

ui->customWidget->name();

当然,您也想为address()phone()创建类似的访问者。

hacky方法是使用QObject::findChild<QLineEdit>()按名称获取行编辑。这真的打破了封装,我不会进一步描述。

答案 1 :(得分:1)

QLineEdit->text()在语法上是不正确的,不会编译。 QLineEdit::text()也不会编译,因为text()是非静态成员,没有QLineEdit对象,此调用没有意义。

回到您的问题,首先您需要访问自定义小部件。一旦你在编辑器中以某种方式命名小部件,这很简单:

enter image description here

在此示例中,其名称为customWidget。因此,在ui类的QDialog私有成员中,您将找到名为customWidget的公共成员,其类型为MyCustomWidget,并且对应于图片上的小部件。有了这个,您可以访问customWidget的公共成员。 QDialog对应于您的用户信息窗口小部件类。

例如,您可以在value1Changed(QString)中声明信号(让我们称呼它们value2Changed(QString)MyCustomWidget等)并将信号从QLineEdit转发到这些信号使用信号到信号connect()。然后,您可以将value1Changed连接到QDialog的任何位置或customWidget指针可见范围内的任何其他对象。

另一种方法是在QString getLine1Content() const中声明MyCustomWidget等公共方法,并随时从QDialog访问它们。

这些不是访问自定义窗口小部件成员的唯一方法,而是最常用的方法。

答案 2 :(得分:0)

根据答案,我创建了一些getter和setter方法来获取和设置“我的自定义窗口小部件”中字段的值。

在我的 MyCustomWidget 课程中,我为每个字段创建了 getters setters

public:
    void setNameLineEdit(QString value);
    QString getNameLineEdit();

    void setAddressLineEdit(QString value);
    QString getAddressLineEdit();

    void setPhoneLineEdit(QString value);
    QString getPhoneLineEdit();

然后:

void MyCustomWidget::setNameLineEdit(QString value)
{
    ui->nameLineEdit->setText(value);
}

QString MyCustomWidget::getNameLineEdit()
{
    return ui->nameLineEdit->text();
}

...

现在我可以从 UserInfo 类中访问这些方法:

ui->myCustomWidget->setNameLineEdit( QString("Paul") );

非常感谢你的帮助。