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

时间:2011-05-27 12:30:15

标签: qt qt4

我有两个类(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中没有显示任何更改

3 个答案:

答案 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_castdynamic_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)插槽。