Qt show () выполняется после функции - PullRequest
2 голосов
/ 04 марта 2020

Я хотел бы показать метку и выполнить функцию после отображения метки. К сожалению, метка всегда отображается после выполнения функции.

void MainWindow::showLabel(){
    myLabel->show();
    doSomething();
}

void MainWindow::doSomething(){
    QThread::msleep(3000);
    myLabel->hide();
}

Итак, когда я выполняю свой код, программа ждет три секунды и впоследствии показывает пустое окно (так как оно непосредственно скрывает метка, прежде чем даже показывать ее; если я прокомментирую функцию скрытия, метка будет показана через три секунды). Я попытался изменить showEvent следующим образом:

void MainWindow::showEvent(QShowEvent *event) {
    QMainWindow::showEvent(event);
    doSomething();
}

Я что-то не так делаю, изменив метод, или есть какой-либо другой способ показать метку перед выполнением следующей функции?

Ответы [ 2 ]

1 голос
/ 04 марта 2020

Я бы решил вашу проблему следующим образом:

void MainWindow::showLabel()
{
    myLabel->show();
    // Wait for 3sec. and hide the label.
    QTimer::singleShot(3000, myLabel, SLOT(hide()));;
}

то есть вам не нужна вторая функция и блокируйте текущий поток с помощью QThread::msleep(), что является причиной появления вашего ярлыка после истечения времени ожидания.

Обновление

Если вам нужно сделать больше, чем просто скрыть метку, определите слот и назовите его следующим образом:

void MainWindow::showLabel()
{
    myLabel->show();
    // Wait for 3sec. and call a slot.
    QTimer::singleShot(3000, this, SLOT(doSomething()));
}

// This is a slot
void MainWindow::doSomething()
{
    myLabel->hide();
    [..]
    // some more stuff
}
0 голосов
/ 04 марта 2020

QThread :: msleep (3000); блокирует основной поток, в котором обрабатывается событие l oop. Так что мешать показывать myLabel пока не закончится время сна. Решением является либо использование QTimer в качестве рекомендованного vahancho, либо вызов события l oop для ручной обработки путем вызова QEventL oop :: exe c () после myLabel-> show (); .

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