LINUX.ORG.RU

Что делать? QProgressDialog блокирует текстовые поля ввода (даже видео есть)

 , ,


0

1

В общем, долго бился с 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 то на текстовое поле. У меня с пятого раза текстовое поле блокируется.

★★★★★

Последнее исправление: Xintrea (всего исправлений: 1)

Не воспроизводится.

➜  ~ qmake --version                                                                                                                         [~]
QMake version 3.1
Using Qt version 5.10.0 in /usr/lib

➜  ~ gcc --version                                                                                                                           [~]
gcc (GCC) 7.2.1 20171128

ox55ff ★★★★★
()

qApp->processEvents();

Лучше вынеси длительную операцию в отдельный поток. Тут можно поймать какой-нибудь баг.

ox55ff ★★★★★
()

А ты быстро кликаешь?

Есть такой вариант:
В очереди событий два клика по кнопке find.
Обрабатывается первое событие и вызывается твой слот
В слоте вызывается processEvents, что приводит к обработке события второго клика. И опять вызывается твой слот, в котором повторно идёт настройка диалога и прочие вещи. И т.д.

ox55ff ★★★★★
()
Ответ на: комментарий от ox55ff

Я написал, он проявляется даже от одного клика.

Xintrea ★★★★★
() автор топика
Ответ на: комментарий от ox55ff

Обрабатывается первое событие и вызывается твой слот
В слоте вызывается processEvents, что приводит к обработке события второго клика. И опять вызывается твой слот, в котором повторно идёт настройка диалога и прочие вещи. И т.д.

Как это может повлиять на блокировку совершенно другого поля?

Xintrea ★★★★★
() автор топика
Последнее исправление: Xintrea (всего исправлений: 1)
Ответ на: комментарий от annulen

У него уже была пара багов Qt 5.5 - 5.6.x QTBUG-47042 QTBUG-47049

И оба invalid

А что это значит? То, что у разрабочиков такие баги не повторялись, не значит что их небыло.

Xintrea ★★★★★
() автор топика
Ответ на: комментарий от ox55ff

А ты быстро кликаешь?

Можешь попеременно понажимать на Find и на поле ввода. Медленно. и равномерно. У меня с пятой попытки поле ввода заблокировалось.

Xintrea ★★★★★
() автор топика
Ответ на: комментарий от Xintrea

Там в комментах расписано, что это не баги а неправильное использование

Тебе наверное нужен QProgressBar, а не QProgressDialog

annulen ★★★★★
()
Ответ на: комментарий от ox55ff

Может это от DE зависит, а может быть от времени, на какое появляется QProgressDialog.

У меня lxqt если что.

Xintrea ★★★★★
() автор топика
Последнее исправление: Xintrea (всего исправлений: 1)

Тебе уже написали, это не баг, а неправильное использование. Не нужно ему делать hide, делай deleteLater()

UVV ★★★★★
()
Ответ на: комментарий от UVV

Тебе уже написали, это не баг, а неправильное использование. Не нужно ему делать hide, делай deleteLater()

Есть виджет поиска: ввел текст, нажал ок, показал прогресс. Поиск закончился - скрыл. Следующий поиск - снова показал. А этих поисков может быть куча. Зачем создавать и удалять?

Xintrea ★★★★★
() автор топика
Ответ на: комментарий от UVV

В общем, этот QProgressDialog реально не подходит для многоразового использования. Если его один раз создать, попользовать и удалить, то бага нет.

Xintrea ★★★★★
() автор топика
Ответ на: комментарий от Xintrea

Когда мне пару месяцев назад потребовались прогресс-диалоги, я потратил минут 10 на 3 штуки. Никаких валидных или невалидных багов, волосы мягкие и шелковистые. ...Так вот... Если у твоего флоу поведение прогресс-диалога отличается от стандартного, то зачем ты сношаешь мозг себе и благородным донам вместо того, чтобы просто взять и запилить нужный тебе диалог за 5 минут?

Stil ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.