Russian Qt Forum
Июнь 20, 2018, 22:19 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: [Решено] QProgressDialog блокирует текстовые поля ввода (даже видео есть)  (Прочитано 788 раз)
xintrea
Супер активный житель
*****
Offline Offline

Сообщений: 724



Просмотр профиля WWW
« : Декабрь 23, 2017, 15:19 »

Долго бился с QProgressDialog в Qt 5.9.2. Пока не сделал минимальный пример, и не увидел что даже в нем у QProgressDialog присутствует баг.

Вообще, QProgressDialog - довольно странный компонент. У него уже была пара багов Qt 5.5 - 5.6.x QTBUG-47042 QTBUG-47049, и вот сейчас еще один, новый.

Но возможно, что это я что-то неправильно делаю, поэтому пишу сюда, может быть бага и нет.

Значит, программа состоит из главного окна, текстового поля и кнопки Find. Текстовое поле просто лежит на форме и ни с чем не связано. В обработчике клика по Find пишу такой код:

Код:
void MainWindow::on_findButton_clicked()
{
    long int totalRec=1000;

    // Показывается виджет линейки наполняемости
    progress->reset();
    progress->setLabelText( tr("Search...") );
    progress->setRange(0, totalRec);
    progress->setModal(true);
    progress->setMinimumDuration(0);
    progress->show();

    for(long int i=0; i<totalRec; i++) {
        progress->setValue(i);
        qApp->processEvents();

      if(progress->wasCanceled())
          break;
    }

    progress->hide();
    progress->cancel(); // Добавлено из-за регрессии, посмотреть как работает
}

И если несколько раз понажимать на кнопку Find, заблокируется поле ввода. И если сделать несолько полей ввода на главном окне, заблокируются все. Без разницы QLineEdit или QTextEdit.

Текст можно в них выбирать, а вот изменить нельзя. И так будет продолжаться до тех пор, пока не переключишься на другое окно и не вернешься обратно.

Тут важно, что QProgressDialog настраивается модальным, и нельзя нажать кнопку Find еще раз, пока показывается прогресс бар. Кроме того, я несколько раз ловил ситуацию, что достаточно одного нажатия, чтоб заблокировались текстовые поля. Но для этого нужно чем-нибудь загрузить систему и поиграться со значением totalRec.

Как можно обойти этот баг?

Минимальный пример: http://rgho.st/68kYmnGng

Видео: https://www.youtube.com/watch?v=D2x6Cvic0fQ&feature=youtu.be

UPD: Можно просто медленно и раздельно понажимать мышкой на кнопку Find и на поле ввода. У меня после пяти раз поле ввода заблокировалось.
« Последнее редактирование: Декабрь 25, 2017, 11:07 от xintrea » Записан

Собираю информацию по крупицам
http://webhamster.ru
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4000



Просмотр профиля WWW
« Ответ #1 : Декабрь 23, 2017, 18:47 »

в макос 10.12.6 на 4.8.7 и 5.6.2 все работает прекрасно и после 20 нажатий, прогресс тоже видно в течение секунды
Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
xintrea
Супер активный житель
*****
Offline Offline

Сообщений: 724



Просмотр профиля WWW
« Ответ #2 : Декабрь 25, 2017, 11:06 »

в макос 10.12.6 на 4.8.7 и 5.6.2 все работает прекрасно и после 20 нажатий, прогресс тоже видно в течение секунды

Кароч, QProgressDialog не подходит для многоразового использования. Его надо каждый раз перед тем как показывать прогресс выполнения создавать, и потом сразу удалять. Тогда бага нет.
Записан

Собираю информацию по крупицам
http://webhamster.ru
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4000



Просмотр профиля WWW
« Ответ #3 : Декабрь 25, 2017, 15:42 »

так его вроде обычно вообще на стеке создают, отработал и исчез
Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  

Страница сгенерирована за 0.121 секунд. Запросов: 22.