LINUX.ORG.RU

Qt 5.6.0 - Появляется странное окно при выполнении app.exec()

 


0

2

Столкнулся с такой проблемой.

Я веду разработку программы на Qt 5.4.2. В какой-то момент народ стал жаловаться, что при старте программы появляется загадочное окно с кнопкой Cancel. Выяснилось, что это окно стало появляться в Qt версии 5.6.0 и выше (есть и в 5.6.2).

Ниже ссылка на обсуждение. Там обсуждаются всякие конфиги, но суть в том, что проблема оказалась не в конфигах, а жестко связана с версией Qt. То есть, странное окно появляется в Qt 5.6.0 и выше, как минимум на Windows и Linux, на 32-х и 64-х битах:

https://github.com/xintrea/mytetra_dev/issues/19

Окно появляется в момент исполнения app.exec(). Отдебажиться не могу, потому что некуда в коде ставить брекпоинт.

Теперь сижу и думаю, как мне поймать появление этого окна, как понять кто его запускает и откуда оно появляется?

Код проекта: https://github.com/xintrea/mytetra_dev

Внешний вид окна: http://i.piccy.info/i9/bbd1ad95597ed93227f98c3f9d95f802/1477641550/3799/10471...

★★★★★

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

По-видимому, Вам не позволено скачивать или просматривать вложения в этом разделе. Пожалуйста, войдите или зарегистрируйтесь на Russian Qt Forum.

CrossFire ★★★★★
()

Отладчиком бряку на функцию создания нативного примитива-окна(на оффтопике это user32::CreateWindowExW/A, онтопиках xcb_create_window чтоли), и посмотреть в стек из какого места Qt оно выныривает. Их не должно быть много(если конечно опять чего не сломали)

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

Там по ссылке у чувака qt-5.5. У меня такая же версия стоит и нет такого окна. Лорчую, что у ТСа в его коде что-то.

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

Именно такого QMessageBox я никогда не делал.

И у меня нет ни одного окна, в котором при русской локализации была бы кнопка Cancel. А этот Cancel виден даже при активной русской локализации. Вот что удивительно.

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

при русской локализации была бы кнопка Cancel.

А Qt ты переводишь файлом qt_ru_RU.qm (или как там его)?

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

Может и в 5.5, просто большенство отписывалось про 5.6. Главное что не 5.4 и ниже, это я сам проверял.

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

И у меня нет ни одного окна, в котором при русской локализации была бы кнопка Cancel. А этот Cancel виден даже при активной русской локализации. Вот что удивительно.

Это стандартная кнопка QMessageBox::Cancel

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

А, блин, я затупил. В Qt же нет общей локализации, так что Cancel на любой форме может быть (и есть).

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

Нет, ты не понял. Это перевод строк твоего приложения. Строки в библиотеки Qt остаются непереведёнными, если не подцепить файлик QtSDK/Qt5.7.0/5.7/gcc_64/translations/qtbase_ru.qm

Отсюда Cancel и не локализуется.

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

В Qt же нет общей локализации

Ошибочное суждение. Смотри пост выше.

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

Ну в общем по внешним признакам понять что за окно не представляется возможны.

Единственное что, попробовать поискать с одним Cancel, без ОК.

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

Не могу найти/вспомнить, был вроде какой-то стандартный класс, в котором были кнопки и даже lineedit/combobox. Я помню что его задействовал, но там проблема была что английские подписи торчали - пришлось создать свою форму, попросили переделать.

I-Love-Microsoft ★★★★★
()
Ответ на: комментарий от I-Love-Microsoft

но там проблема была что английские подписи торчали

Нужно было, добавить перевод QtWidgets, а не колхозить :3

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

Выдержка из моего коммита в одном из проектов.

QProgressDialog *cacheProgressDialog = new QProgressDialog(this, Qt::Dialog | Qt::WindowTitleHint);
// Since Qt 5.5, QProgressDialog works as intended: it show
// itself on construction after minimumDuration() (4 seconds by default). Cancel it.
cacheProgressDialog->cancel();

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

Так он говорит, что он его вроде не использует..

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

lol, я как раз тоже самое сейчас заметил, скачав проект =)

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

Я нашел все ".exec(" и "->exec(" и поставил туда брекпоинты (штук 70), за исключением меню и прочих объектов, которые тоже имеют метод exec(). И ничего не словилось, окошко появляется.

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

Правильно ли я понимаю, что в Qt 5.5 любой диалог QProgressDialog будет сразу отрисовываться после создания через 4 сек., не дожидаясь show()?

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

Правильно ли я понимаю, что в Qt 5.5 любой диалог QProgressDialog будет сразу отрисовываться после создания через 4 сек., не дожидаясь show()?

// If the operation is expected to take this long (as predicted by
// progress time), show the progress dialog.
static const int defaultShowTime = 4000;

вообще я не вижу проблемы. Нах их держать созданными в памяти? Он нужен на короткое время. Понадобился - создал, использовал, удалил.

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

Я тогда зелёный ещё был - не умел структурами пользоваться.

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

По твоей же ссылке:

QProgressDialog is designed to show itself automatically, based on an internal estimate for the duration of the operation and the minimumDuration property. You never call show() or exec() on it manually. You're also not supposed to keep it around when it's not used. In 5.4, the only way to start the internal duration estimation was to call setValue(0). But we noticed that many people didn't call setValue(0), but just handed external progress information on to the progress dialog, and whether or not that progress information started at 0 or, say, 1, would determine whether the dialog would show itself at all, or not. This was thought to be a bit fragile, so we changed it so that the start time of the duration estimate was the dialog construction time unless setValue(0) (or, more correctly, setValue(minimum()) was called, leading to the dialog showing itself minimumDuration after its construction, even if it was constructed not for immediate use (which the dialog cannot distinguish from a really long-running operation).

Thanks, now I understand the idea! So basically, if one does not need such complicated functionality, one is better off designing their own primitive dialog with a progress bar instead of using QProgressDialog.

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

it show itself

оно показывают себя

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

Благодарю, я б такое никогда не нашел.
На QProgressDialog похож. По-grep'ай в проекте, есть такой у тебя?

/0

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

А еще на шланге куча варнингов, а на gcc ни одного. И еще на интелёвом и микрософтовском компилере не проверял, наверняка куча проблем будет.

У меня разработка на 5.4.2. То, что стал ковыряться с 5.6.x - это исключение, потому что несколько человек давно просили, и было непонятно в чем проблема.

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

И что, сторонний разработчик должен знать, что в Qt 5.5 разломали стандартное поведение, которое до этого годами работало?

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

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

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

Ничо я не игнорю. Я втыкал брекпоинты на отрисовку диалога прогресса progress->show(), думал может какой сигнал проскакивает. Но кто в здравом уме мог предположить, что брекпоинт надо было ставить на конструктор и последующий hide() для того чтобы увидеть диалог?

Xintrea ★★★★★
() автор топика
Ответ на: комментарий от Xintrea
87bt
>&"bt\n"
>~"#0  0x00007ffff5d5e600 in QDateTime::QDateTime() () from /opt/toolkits/QtSDK/Qt5.7.0/5.7/gcc_64/lib/libQt5Core.so.5\n"
>~"#1  0x00007ffff5d6337f in QDateTime::fromMSecsSinceEpoch(long long, Qt::TimeSpec, int) () from /opt/toolkits/QtSDK/Qt5.7.0/5.7/gcc_64/lib/libQt5Core.so.5\n"
>~"#2  0x00007ffff5d63798 in QDateTime::currentDateTime() () from /opt/toolkits/QtSDK/Qt5.7.0/5.7/gcc_64/lib/libQt5Core.so.5\n"
>~"#3  0x00007ffff5d63801 in QTime::currentTime() () from /opt/toolkits/QtSDK/Qt5.7.0/5.7/gcc_64/lib/libQt5Core.so.5\n"
>~"#4  0x000000000042c6af in smartPrintDebugMessage (msg=...) at ../my_tetra/src/main.cpp:230\n"
>~"#5  0x000000000042c9c7 in myMessageOutput (type=QtDebugMsg, context=..., msgText=...) at ../my_tetra/src/main.cpp:276\n"
>~"#6  0x00007ffff5d0446e in qt_message_output(QtMsgType, QMessageLogContext const&, QString const&) () from /opt/toolkits/QtSDK/Qt5.7.0/5.7/gcc_64/lib/libQt5Core.so.5\n"
>~"#7  0x00007ffff5e017e0 in QDebug::~QDebug() () from /opt/toolkits/QtSDK/Qt5.7.0/5.7/gcc_64/lib/libQt5Core.so.5\n"
>~"#8  0x00000000005159fd in DataBaseConfig::~DataBaseConfig (this=0xaccd60 <dataBaseConfig>, __in_chrg=<optimized out>) at ../my_tetra/src/models/dataBaseConfig/DataBaseConfig.cpp:37\n"
>~"#9  0x00007ffff4bb6f88 in __run_exit_handlers () from /usr/lib/libc.so.6\n"
>~"#10 0x00007ffff4bb6fd5 in exit () from /usr/lib/libc.so.6\n"
>~"#11 0x00007ffff4ba1617 in __libc_start_main () from /usr/lib/libc.so.6\n"
>~"#12 0x000000000042b969 in _start ()\n"
>87^done

http://wstaw.org/m/2016/10/28/Screenshot_20161028_184712.png

Вооот здесь сегфолтится при выходе.

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

Понятно. Похоже, что переопределенный хендлер отладочных сообщений разрушается раньше, чем выводятся сами сообщения. То есть проблема начинается в myMessageOutput.

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