Qt: Обновить виджеты, которые скрыты, прежде чем они будут показаны? - PullRequest
6 голосов
/ 06 января 2012

У меня есть два QDialogs, накладываемые друг на друга, с некоторыми общими данными между ними, показанными в QWidget в макете каждого диалога (виджет, показывающий количество графически).

В показанном в настоящее время QDialog пользователь может изменить эти данные.Это изменение распространяется на оба виджета, и в текущем QDialog отображается правильное количество.Однако, когда пользователь закрывает этот QDialog, а тот, что внизу, становится видимым, QWidget, показывающий счетчик, показывает старое значение за долю секунды до того, как оно обновляется до правильного значения.

Я знаю, что QWidget снизуимеет правильное значение до того, как будет показан другой QDialog, но я не могу заставить Диалог обновить до того, как станет видимым.Я пытался сделать это, пока он еще был скрыт:

hiddenDialog->layout()->activate()

hiddenDialog->layout()->update()

Но он все равно не может обновиться, пока не появится диалоговое окно.Моя проблема вроде как связана с Qt: Как заставить скрытый виджет рассчитать его макет? , за исключением того, что я хочу затем показать QDialog после установки Qt :: WA_DontShowOnScreen.После включения Qt :: WA_DontShowOnScreen и обновления диалогового окна я попытался установить:

dialog->setAttribute(Qt::WA_DontShowOnScreen, false);

dialog->show()

Но диалог по-прежнему не отображается на экране.Есть ли способ сделать его снова видимым?Или есть какой-то способ обновить диалоговое окно и виджеты, когда они скрыты другим диалоговым окном?


Вот еще несколько деталей по запросу: Есть два класса, Dialog1 и Dialog2, каждый из которых расширяет одно и то же.базовый класс BaseDialog, расширяющий класс QDialog.

BaseDialog имеет слот, который вызывается при каждом изменении GlobalCount.Этот слот обновляет countWidget, который рисует картину счета.

void BaseDialog::updateCountWidget()
{
    _countWidget->updateCount(globalCount);
    _countWidget->update();
}

В Dialog1 есть слот (подключенный из QPushButton click ()), который создает и показывает Dialog2:

void Dialog1::showDialog2()
{
    Dialog2* dialogTwo = new Dialog2();
    dialog2->show();
}    

Dialog2 имеет два слота (подключенных к сигналам QPushButton), один вычитает из общего счета, другой закрывает диалог.Когда вычитается глобальный счет, он посылает сигнал, подключенный к слоту updateCountWidget () как Dialog1, так и Dialog2.

void Dialog2::subtractCount()
{
    GlobalCount.subtractOne();
}

void Dialog2::userClosed()
{
    accept();
}

Когда я нажимаю кнопку вычитания, я вижу правильно _countWidget обновления Dialog2,Однако, когда я закрываю Dialog2 и снова вижу Dialog1, _countWidget в Dialog1 показывает исходное значение счетчика за доли секунды, а затем обновляет новое значение.

Моя цель - предотвратить это мгновенное обновление, как это выглядит действительно прикольно для пользователя.Это стало неприлично длинным, но я ценю любые идеи!

Ответы [ 2 ]

7 голосов
/ 07 января 2012

вызов

hide() 

на виджете, когда вы делаете

setAttribute(Qt::WA_DontShowOnScreen, true);

После этого

setAttribute(Qt::WA_DontShowOnScreen, false);
show()

и он будет работать

Я используюQt встроен в Linux

0 голосов
/ 22 мая 2013

Вы также можете попробовать сделать hiddenDialog->layout()->update() до ->activate(), который работал в аналогичном случае для меня, и не нужно было связываться с атрибутами WA_xxx.

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