如何从自定义小部件中访问小部件?
例如:
现在我有一个"用户信息"将QWidget提升为"我的自定义小部件":
的表单如何从自定义小部件中获取文本? (例如QLineEdit->text()
)
答案 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
对象,此调用没有意义。
回到您的问题,首先您需要访问自定义小部件。一旦你在编辑器中以某种方式命名小部件,这很简单:
在此示例中,其名称为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") );
非常感谢你的帮助。