как получить доступ к виджету из другого класса - PullRequest
2 голосов
/ 27 мая 2011

У меня есть два класса (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. Теперь я просто закрываю ViewContact с помощью функции this.close();.

Я предоставляю QLineEdit как открытый и пытаюсь изменить текст,Ошибок не возникает.Но никакие изменения не отображаются в QLineEdit внутри MyWidget

Ответы [ 3 ]

1 голос
/ 28 мая 2011

Это похоже на идеальное время, чтобы использовать в своих интересах сигналы и слоты Qt. Вы можете подключить сигнал, который выдает значение, которое вы хотите обновить, в вашем объекте MyWidget из виджета ViewContacts.

Сначала вам нужно создать сигнал, который выдает измененное значение при закрытии виджета 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 ) ) );
1 голос
/ 06 июня 2011

Добавьте сигнал в класс ViewContact и издайте сигнал при закрытии виджета ViewContact. Сигнал должен содержать строку для привязки представления списка. Перед тем как инициировать виджет ViewContact из MyWidget, следует подключить сигнал и слот setText (const QString).

1 голос
/ 27 мая 2011

Добавьте 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 в предоставленном вами фрагменте, потому что слепой бросок небезопасен.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...