如何从另一个类访问小部件

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_castdynamic_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 ) ) );

【讨论】:

以上是关于如何从另一个类访问小部件的主要内容,如果未能解决你的问题,请参考以下文章

Kivy:从另一个类的小部件中检索文本?

如何从另一个窗口访问一个窗口的小部件?

如何访问在其他类中的一个类中定义的小部件,而不会看到重新定义的图形界面

如何从另一个小部件更改有状态小部件的变量?

从另一个 Activity 访问一个 Activity 中的小部件

如何从另一个小部件状态处理一个小部件状态?