如何从另一个类访问小部件
Posted
技术标签:
【中文标题】如何从另一个类访问小部件【英文标题】:how to access a widget from another class 【发布时间】:2011-05-27 12:30:15 【问题描述】:我有两个类(MyWidget、ViewContact)。在 MyWidget 中,有一个 QLineEdit 和 QListWidget。 QListWidget 中的内容随着 QLineEditt 的变化而动态变化。
ViewContact 类中有很多小部件。ViewContact 类由 MyWidget 类调用。
void MyWidget::viewbind(QListWidgetItem *item)
LblNames *widget = (LblNames*)( listWidget->itemWidget(item) );
ViewContacts *v=new ViewContacts(widget->getLabelId());
v->show();
然后 ViewContact 小部件显示为窗口,没问题。工作正常。
单击 ViewContact 类中的更新按钮时,我需要关闭该窗口并更改 MyWidget 中的文本。现在我只需通过 this.close();
函数关闭 ViewContact。
我将 QLineEdit 设为公开并尝试更改文本。不会发生错误。但在 MyWidget 内的 QLineEdit 中没有显示任何更改
【问题讨论】:
【参考方案1】:在 ViewContact 类中添加一个信号,并在关闭 ViewContact Widget 时发出一个信号。信号应该包含一个字符串来绑定您的列表视图。在从 MyWidget 启动 ViewContact Widget 之前,应该连接信号和 setText(const QString) 插槽。
【讨论】:
【参考方案2】:将MyWidget
作为父级添加到您的ViewContacts
实例。这将允许您调用一个函数来更新文本(它还将修复您当前在代码中存在的内存泄漏)。
您的 ViewContacts 需要一个构造函数,该构造函数接受父级和 labelId。
class ViewContacts : public QWidget // or whatever it is, you didn't tell
Q_OBJECT
public:
// I don't know the class of "LabelId" either
explicit ViewContacts(LabelId id, QObject* parent = 0) : QWidget(parent)
// ...
void updateTextInParent()
MyWidget* w = qobject_cast<MyWidget*>(this->parent());
if (NULL != w)
// w is a valid pointer to a MyWidget instance
// you can access any public fields and function through it.
;
您还应该在您提供的 sn-p 中使用 qobject_cast
或 dynamic_cast
,因为盲投不安全。
【讨论】:
【参考方案3】:这似乎是利用 Qt 的信号和槽的最佳时机。您可以从 ViewContacts 小部件连接一个信号,该信号发出您要在 MyWidget 对象中更新的值。
首先,您需要创建一个在 ViewContacts 小部件关闭时发出更改值的信号。
类似:
Q_SIGNALS:
void value_changed_signal( QString value );
接下来您需要在 MyWidget 父类中添加一个插槽,它可以是私有的
声明类似于:
private Q_SLOTS:
void update_text( QString value );
最后,在您的 MyWidget 类中,在您实例化 ViewContacts 对象之后的某个地方,将信号和插槽与以下内容连接起来:
connect(new_view_contacts_object, SIGNAL( value_changed_signal( QString ) ),
this, SLOT( update_text( QString ) ) );
【讨论】:
以上是关于如何从另一个类访问小部件的主要内容,如果未能解决你的问题,请参考以下文章
如何访问在其他类中的一个类中定义的小部件,而不会看到重新定义的图形界面