我有两个类(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中没有显示任何更改
答案 0 :(得分:1)
将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.
}
}
};
您还应该在自己提供的代码段中使用qobject_cast
或dynamic_cast
,因为盲目投射不安全。
答案 1 :(得分:1)
这似乎是利用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 ) ) );
答案 2 :(得分:1)
在ViewContact类中添加一个信号,并在关闭ViewContact Widget时发出信号。信号应该包含一个字符串来绑定你的列表视图。在从MyWidget启动ViewContact Widget之前,应该连接信号和setText(const QString)插槽。