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

How can I access widgets from a customized widget?

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

例如:

我有一个定制的小部件:

现在我有一个“用户信息”表单,其中有一个 QWidget 提升为“我的自定义小部件”:

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

正确的方法是在您的 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();
}

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

ui->customWidget->name();

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


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

QLineEdit->text() 语法不正确,无法编译。 QLineEdit::text() 也不会编译,因为 text() 是非静态成员,如果没有 QLineEdit 对象,这个调用就没有意义。

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

在这个例子中它的名字是customWidget。因此,在 QDialog class 的 ui 私有成员中,您会找到一个名为 customWidget 的 public 成员,其类型为 MyCustomWidget 并对应到图片上的小部件。有了这个,您可以访问 customWidget 的 public 成员。 QDialog 对应于您的用户信息小部件 class。

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

另一种方法是在 MyCustomWidget 中声明 public 方法,例如 QString getLine1Content() const 并在需要时从 QDialog 访问它们。

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

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

在我的 MyCustomWidget class 中,我创建了 getterssetters每个字段:

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 class:

访问这些方法
ui->myCustomWidget->setNameLineEdit( QString("Paul") );

非常感谢大家的帮助。