Название: [РЕШ.] QMessageBox. Крэш при установке пользовательского размера окна (Qt 5.2.1) Отправлено: Fuzzy Barsik от Февраль 21, 2014, 00:25 Добрый день всем! (http://www.kolobok.us/smiles/personal/hi.gif)
Поскольку я только-только начал знакомиться с Qt, неудивительно, что у меня с ним много проблем, - не бейте сильно, пожалуйста, если что... Я пытаюсь задать пользовательский стиль окнам QMessageBox, которые появляются при выборе пунктов меню (например, при выборе пункта Updates...), и в первую очередь - задать адекватный размер, поскольку подгоняемые системой размеры под размер текста - слишком маленькие. Поскольку setFixedSize() и другие подобные манипуляции по какой-то причине не работают, я пытаюсь использовать костыли вот отсюда (https://qt-project.org/forums/viewthread/24777/#114340). Вот код: fuzzygui.cpp Код
fuzzygui.h Код
main.cpp Код
Нужный размер, безусловно, устанавливается, но как только я нажимаю на кнопку во втором окне, программа падает... При этом всё нормально работает, если размер окон менять не пытаться... Буду признателен, если кто-либо поможет проблему разрешить. Если есть более простое решение, возможно, с использованием других классов, буду признателен за подсказку. С компиляцией проектов на моей сборке Qt (официальная сборка Qt 5.2.1 for Windows 64-bit VC 2012 (ANGLE)) изначально были проблемы (http://forum.tver-soft.org/index.php/topic,852.0.html). Влияет ли это как-то на нынешние падения, я не знаю... Также хотелось бы понять, как полностью избавиться в QMessageBox от иконки в заголовке окна и как задать нужный мне цвет фона (сейчас появляется системное окно, разделённое на две части: один цвет в верхней части окна с текстом и другой цвет в нижней с кнопками). (http://i067.radikal.ru/1402/3d/1ffd81bfe21c.jpg) Заранее признателен. Название: Re: QMessageBox. Крэш при установке пользовательского размера окна (Qt 5.2.1) Отправлено: Bepec от Февраль 21, 2014, 00:40 На первый взгляд тут опасно
Код: layout = (QGridLayout*)ch Название: Re: QMessageBox. Крэш при установке пользовательского размера окна (Qt 5.2.1) Отправлено: kambala от Февраль 21, 2014, 02:45 по-моему проще свой диалог написать, чем вставлять всякие грязные хаки, раз QMessageBox сильно не устраивает
иконку наверное можно убрать только через WinAPI Название: Re: QMessageBox. Крэш при установке пользовательского размера окна (Qt 5.2.1) Отправлено: Bepec от Февраль 21, 2014, 12:08 setIcon(QIcon()) ? :)
Название: Re: QMessageBox. Крэш при установке пользовательского размера окна (Qt 5.2.1) Отправлено: Fuzzy Barsik от Февраль 21, 2014, 13:26 Вы преобразовываете сишно и не проверяете результата. Э-э-э... Это не я, это автор костыля - я до этого ещё вообще не дорос... (http://www.kolobok.us/smiles/standart/blush.gif)Преобразование вида QGridLayout* layout = const_cast<QGridLayout*>(updateOptions.layout()); выдаёт ошибку компилятора: "C2440: 'const_cast' : cannot convert from 'QLayout *' to 'QGridLayout *' Conversion from pointer to base class to pointer to derived class requires an explicit cast (other than const_cast)". Если вместо const использовать другие преобразования - крэш. Если вместо QGridLayout задать QLayout, невозможно отформатировать расположение добавляемого QSpacerItem, бо на поверку оказывается, что стиль окна - это всё же Grid, и в итоге всё равно крэш. setIcon(QIcon()) ? :) А разве setIcon() у QMessageBox (http://qt-project.org/doc/qt-5/qmessagebox.html#icon-prop) как-то влияет на иконку окна? Или я совсем безнадёжен?по-моему проще свой диалог написать, чем вставлять всякие грязные хаки, раз QMessageBox сильно не устраивает Наверное, Вы правы.З.Ы. Пошёл читать книжки... Название: Re: QMessageBox. Крэш при установке пользовательского размера окна (Qt 5.2.1) Отправлено: Alex Custov от Февраль 21, 2014, 13:44 А разве setIcon() у QMessageBox (http://qt-project.org/doc/qt-5/qmessagebox.html#icon-prop) как-то влияет на иконку окна? Неверный совет. http://qt-project.org/doc/qt-4.8/qwidget.html#windowIcon-prop Название: Re: QMessageBox. Крэш при установке пользовательского размера окна (Qt 5.2.1) Отправлено: Bepec от Февраль 21, 2014, 14:18 Каюсь, не дочитал ТС-са, думал об внутриоконной иконке речь.
А на окне будет иконка родительского окна. Название: Re: QMessageBox. Крэш при установке пользовательского размера окна (Qt 5.2.1) Отправлено: Fuzzy Barsik от Февраль 21, 2014, 19:15 Крэш победил путём повторного создания QSpacerItem для второго окна.
Поигрался с setWindowIcon() и setWindowFlags(). Код сейчас выглядит как-то так: Код В случае с setWindowFlags() вариантов, почему-то, получается всего два: либо не иметь иконки окна и кнопки "Закрыть", либо иметь и то, и другое. Иметь кнопку "Закрыть" и не иметь иконки окна по какой-то причине не можно... В случае с setWindowIcon() иконку-невидимку создать, вроде, можно, но на её месте остаётся "дыра"... Буржуазные разработчики при этом не стесняются демонстрировать нам своё превосходство в этом вопросе, как-бы вопрошая: "А что можете противопоставить нам вы, советские учёные?" (http://s019.radikal.ru/i638/1402/e1/b9e343f49ad2.jpg) Название: Re: QMessageBox. Крэш при установке пользовательского размера окна (Qt 5.2.1) Отправлено: kambala от Февраль 21, 2014, 22:12 наследник QDialog с аналогичным функционалом пишется быстрее и чище
разве гуй MPC-HC написан на Qt? Название: Re: QMessageBox. Крэш при установке пользовательского размера окна (Qt 5.2.1) Отправлено: Fuzzy Barsik от Февраль 21, 2014, 22:17 разве гуй MPC-HC написан на Qt? Нет. Это просто пример.наследник QDialog с аналогичным функционалом пишется быстрее и чище Убрать иконку я и в QDialog не смог.Название: Re: QMessageBox. Крэш при установке пользовательского размера окна (Qt 5.2.1) Отправлено: kambala от Февраль 21, 2014, 23:29 в документации написано, что кнопка закрытия не может существовать без иконки системного меню на некоторых платформах (видно винда — одна из них). остается разве что лезть в WinAPI
Название: Re: QMessageBox. Крэш при установке пользовательского размера окна (Qt 5.2.1) Отправлено: Fuzzy Barsik от Февраль 21, 2014, 23:36 Возможно. Вопрос только в том, что MPC Home Cinema - не единственное приложение, в котором модальные окна имеют кнопку "Закрыть", но не имеют иконки окна. Фактически, стандартом как раз и является окно с кнопкой, но без иконки. Всё это в Windows.
Название: Re: QMessageBox. Крэш при установке пользовательского размера окна (Qt 5.2.1) Отправлено: kambala от Февраль 22, 2014, 01:39 скорее всего эти приложения рисуются нативными средствами ОС, поэтому
остается разве что лезть в WinAPI P.S. обратимся к исходникам: Код
Название: Re: QMessageBox. Крэш при установке пользовательского размера окна (Qt 5.2.1) Отправлено: Fuzzy Barsik от Февраль 22, 2014, 08:43 Ну, вот и вопрос, зачем в Qt реализовано именно так...
В дефолтное окно MessageBox в МелкоSoft Visual Studio системное меню (иконку) принудительно не суют: (http://i023.radikal.ru/1402/4d/390635c77610.jpg) Название: Re: [РЕШ.] QMessageBox. Крэш при установке пользовательского размера окна (Qt 5.2.1) Отправлено: kambala от Февраль 22, 2014, 14:55 оказывается надо было просто загуглить, первые же ссылки дают ответ:
http://stackoverflow.com/questions/1235812/qt-dialog-with-no-window-icon-system-menu http://qt-project.org/wiki/Remove_the_System_Menu_of_a_QDialog_on_Windows Название: Re: [РЕШ.] QMessageBox. Крэш при установке пользовательского размера окна (Qt 5.2.1) Отправлено: Igors от Февраль 22, 2014, 17:27 По мне так вообще системный title - то так, когда нужно что-то слепить по-быстрому. FramelessWindowHint - вот капитальный подход к делу. Ну ладно, а вот такой вопросик:
На скриншотах ясно видно что месяга размещена, мягко говоря, "неоптимально" - текста с гулькин "нос", а окно как большой лапоть. Как бы сделать так чтобы автоматом/пулеметом сайзилось под текст месяги? Спасибо Название: Re: [РЕШ.] QMessageBox. Крэш при установке пользовательского размера окна (Qt 5.2.1) Отправлено: kambala от Февраль 22, 2014, 19:17 обычно adjustSize() помогает, хотя QMessageBox сам вроде неплохо размер подбирает. или вопрос о WinAPI диалогах?
Название: Re: [РЕШ.] QMessageBox. Крэш при установке пользовательского размера окна (Qt 5.2.1) Отправлено: Igors от Февраль 22, 2014, 19:24 обычно adjustSize() помогает, хотя QMessageBox сам вроде неплохо размер подбирает. или вопрос о WinAPI диалогах? Про WinAPI ничего не скажу, но на OSX размер подбирается "из рук вон плохо" - еще хуже чем в показанных скриншртахНазвание: Re: [РЕШ.] QMessageBox. Крэш при установке пользовательского размера окна (Qt 5.2.1) Отправлено: kambala от Февраль 22, 2014, 19:32 нативный NSAlert же тоже много места оставляет, разве нет?
Название: Re: [РЕШ.] QMessageBox. Крэш при установке пользовательского размера окна (Qt 5.2.1) Отправлено: Fuzzy Barsik от Февраль 22, 2014, 22:24 По мне так вообще системный title - то так, когда нужно что-то слепить по-быстрому. FramelessWindowHint - вот капитальный подход к делу. На вкус и цвет фломастеры разные. По мне так как раз системный фрейм и делает кросс-платформенное приложение родным для каждой ОС.На скриншотах ясно видно что месяга размещена, мягко говоря, "неоптимально" - текста с гулькин "нос", а окно как большой лапоть. Как бы сделать так чтобы автоматом/пулеметом сайзилось под текст месяги? Оно как раз по умолчанию и "оптимизируется" под размер текста, как уважаемый kambala и говорит:(http://s020.radikal.ru/i712/1402/18/0ae2288cd91f.jpg) И именно эта неуправляемая "оптимизация" мне и не нужна. Зачем разработчики MPC Home Cinema такой размер окна сделали - не имею ни малейшего представления. оказывается надо было просто загуглить Гранаты у Вас не той системы - я, почему-то, на Qt Project только про setWindowFlags() находил...Пример со stackoverflow даёт тот же результат, что и setWindowFlags(). По крайней мере, у меня и у автора вопроса на stackoverflow... Класс с Qt Project прикрутить пока не могу - Qt почему-то отказывается видеть #include <QtGui/QDialog> (как и просто <QDialog>) в mydialog.h и, соответственно, компилировать проект. Буду подумать... (http://www.kolobok.us/smiles/standart/scratch_one-s_head.gif) Название: Re: [РЕШ.] QMessageBox. Крэш при установке пользовательского размера окна (Qt 5.2.1) Отправлено: kambala от Февраль 22, 2014, 22:30 может mydialog не добавлен в HEADERS и/или SOURCES в .pro?
в качестве жутко грязного хака для растяжения окна можно банально пробелов налепить в конце строки :) Название: Re: [РЕШ.] QMessageBox. Крэш при установке пользовательского размера окна (Qt 5.2.1) Отправлено: Fuzzy Barsik от Февраль 22, 2014, 22:44 может mydialog не добавлен в HEADERS и/или SOURCES в .pro? В .pro его автоматом добавляет Qt Creator при создании нового файла для класса. В fuzzygui.h #include "mydialog.h" добавлен ручками. Компилятор не видит стандартный #include <QtGui/QDialog> в mydialog.h...в качестве жутко грязного хака для растяжения окна можно банально пробелов налепить в конце строки :) Фу-у-у... (http://www.kolobok.us/smiles/standart/nea.gif)Название: Re: [РЕШ.] QMessageBox. Крэш при установке пользовательского размера окна (Qt 5.2.1) Отправлено: kambala от Февраль 22, 2014, 23:15 не может он в одном файле видеть, а в другом — нет. попробуй может эту строчку руками набрать, мало ли что там при копировании случилось…
Название: Re: [РЕШ.] QMessageBox. Крэш при установке пользовательского размера окна (Qt 5.2.1) Отправлено: Fuzzy Barsik от Февраль 22, 2014, 23:29 Не-е-е, саму строчку он видит, читает правильно. Говорит: "Нету QDialog в твоих библиотеках!" Ручками перебивал (это, кстати, первое, что всегда в голову приходит). Иногда в других примерах помогало удаление QtGui/ перед названием класса, но сейчас пока никак... У мну просто сама сборка Qt криво вставала - может из-за этого (переменные среды какие не видит или ещё что...) Хотя, может, как обычно, проблема одна, и она сидит перед моим монитором...
Название: Re: [РЕШ.] QMessageBox. Крэш при установке пользовательского размера окна (Qt 5.2.1) Отправлено: kambala от Февраль 23, 2014, 00:20 выложи проект полностью архивом, узнаем в чем проблема
Название: Re: [РЕШ.] QMessageBox. Крэш при установке пользовательского размера окна (Qt 5.2.1) Отправлено: Fuzzy Barsik от Февраль 23, 2014, 00:56 FuzzyGUI.7z (https://www.dropbox.com/s/m98x0mjmz1qboed/FuzzyGUI.7z)
Название: Re: [РЕШ.] QMessageBox. Крэш при установке пользовательского размера окна (Qt 5.2.1) Отправлено: kambala от Февраль 23, 2014, 01:15 после удаления QtGui/ и напихивания reinterpret_cast для конвертации между HWND и WId все взлетело в 5.2.1, а в 4.8.5 вообще никакие правки не потребовались. еще пришлось Q_WS_WIN заменить на Q_OS_WIN, т.к. в Qt 5 *_WS_* дефайны убрали.
P.S. файл .user выкладывать не нужно — там хранятся настройки конкретной машины. Название: Re: [РЕШ.] QMessageBox. Крэш при установке пользовательского размера окна (Qt 5.2.1) Отправлено: Fuzzy Barsik от Февраль 23, 2014, 01:27 после удаления QtGui/ и напихивания reinterpret_cast для конвертации между HWND и WId все взлетело в 5.2.1, а в 4.8.5 вообще никакие правки не потребовались. еще пришлось Q_WS_WIN заменить на Q_OS_WIN, т.к. в Qt 5 *_WS_* дефайны убрали. Пасиба! (http://www.kolobok.us/smiles/standart/thank_you2.gif)Завтра с утра попробую у себя. вот только картина вышла не очень (см. скрин), но на эскейп реагирует и высвечивает что я угадал :) Нормальный картинко! Осталось только WindowCloseButtonHint добавить и посмотреть, не вылезет ли файл .user выкладывать не нужно — там хранятся настройки конкретной машины. Ага, я знаю. Я просто спасть уже собрался - не соображаю ничего, все файлы выделил, а Ctrl+Click на .user нажать уже не смог...Название: Re: [РЕШ.] QMessageBox. Крэш при установке пользовательского размера окна (Qt 5.2.1) Отправлено: Igors от Февраль 23, 2014, 04:55 нативный NSAlert же тоже много места оставляет, разве нет? Оно как раз по умолчанию и "оптимизируется" под размер текста, как уважаемый kambala и говорит: Так есть возможность этим порулить или как? "Много или мало" - неважно в какую сторону, главное все равно "плохо" :)И именно эта неуправляемая "оптимизация" мне и не нужна. Название: Re: [РЕШ.] QMessageBox. Крэш при установке пользовательского размера окна (Qt 5.2.1) Отправлено: Fuzzy Barsik от Февраль 23, 2014, 10:12 Так есть возможность этим порулить или как? Так, вот этот костыль Код именно для того и предназначен. У меня другой был вопрос совершенно. Название: Re: [РЕШ.] QMessageBox. Крэш при установке пользовательского размера окна (Qt 5.2.1) Отправлено: Fuzzy Barsik от Февраль 23, 2014, 10:50 Чё-та это... После добавления Qt::WindowCloseButtonHint опять системное меню вылезло... (http://www.kolobok.us/smiles/standart/sorry.gif)
FuzzyGUI.7z (https://www.dropbox.com/s/m98x0mjmz1qboed/FuzzyGUI.7z) Название: Re: [РЕШ.] QMessageBox. Крэш при установке пользовательского размера окна (Qt 5.2.1) Отправлено: kambala от Февраль 23, 2014, 14:38 в 4.8.5 помогла передача флагов в качестве параметра конструктора, а в 5.2.1 — нет
оказывается даже багрепорт такой есть, который пока реализовывать не собираются: https://bugreports.qt-project.org/browse/QTBUG-2027 уже 6 лет он там висит... Название: Re: [РЕШ.] QMessageBox. Крэш при установке пользовательского размера окна (Qt 5.2.1) Отправлено: Fuzzy Barsik от Февраль 23, 2014, 15:10 (http://www.kolobok.us/smiles/standart/ireful2.gif)
А это... а можно клонировать библиотечные QWidget и QDialog, для клона QWidget переписать QWidgetPrivate::adjustFlags(), убрав принудительное присвоение Qt::WindowSystemMenuHint, а клон QDialog сделать дочерним клонированному QWidget? Не?.. Название: Re: [РЕШ.] QMessageBox. Крэш при установке пользовательского размера окна (Qt 5.2.1) Отправлено: kambala от Февраль 23, 2014, 15:23 проще уж просто исходники модифицировать, вот только бесплатная лицензия не разрешает распространять (или продавать?) такие программы насколько я помню
неужели так принципиальна та иконка? :) в крайнем случае просто показывай там нативный диалог... Название: Re: [РЕШ.] QMessageBox. Крэш при установке пользовательского размера окна (Qt 5.2.1) Отправлено: Fuzzy Barsik от Февраль 23, 2014, 15:52 проще уж просто исходники модифицировать, вот только бесплатная лицензия не разрешает распространять (или продавать?) такие программы насколько я помню Продавать - вроде, не очень, а распространять можно. А мне как раз туда.неужели так принципиальна та иконка? :) Принципиален тотальный контроль. Ну, и стандартам неплохо было бы соответствовать...в крайнем случае просто показывай там нативный диалог... Ну, это-то оно да...Название: Re: [РЕШ.] QMessageBox. Крэш при установке пользовательского размера окна (Qt 5.2.1) Отправлено: Igors от Февраль 23, 2014, 16:16 А есть ли возможность "приятно" вписать текст? Напр дана строка, вычислить размеры QRect исходя из пропорции 4:3. Довольно мерзкая задачка если делать руками - напр надо учесть что до 4:3 дело может и не дойти если текст достаточно короток.
Пока обсуждение показывает что "в общем и целом" QMessageBox не оправдывает оказанного доверия - была бы возможность хорошо вписать текст, остальное (иконку, кнопки и.т.п) накрутить проблем нет. Название: Re: [РЕШ.] QMessageBox. Крэш при установке пользовательского размера окна (Qt 5.2.1) Отправлено: Fuzzy Barsik от Февраль 23, 2014, 16:25 Обсуждение здесь давно не касается QMessageBox.
Длину строки сообщения подсчитать Вы можете. Какие размеры задавать QSpacerItem в зависимости от длины строки сообщения - определяйте сами. Если для Вас не проблема "накрутить" кнопку закрытия окна при отсутствующем системном меню (иконки окна) без переписывания библиотечного QWidget, поделитесь. Название: Re: [РЕШ.] QMessageBox. Крэш при установке пользовательского размера окна (Qt 5.2.1) Отправлено: Fuzzy Barsik от Март 04, 2014, 20:05 оказывается даже багрепорт такой есть, который пока реализовывать не собираются: https://bugreports.qt-project.org/browse/QTBUG-2027 уже 6 лет он там висит... Fixed! (https://bugreports.qt-project.org/browse/QTBUG-2027)(http://www.kolobok.us/smiles/standart/yes2.gif) |