Russian Qt Forum

Qt => Вопросы новичков => Тема начата: Fuzzy Barsik от Февраль 21, 2014, 00:25



Название: [РЕШ.] 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
Код
PHP
#include "fuzzygui.h"
#include "ui_fuzzygui.h"
 
#include <QMessageBox>
#include <QSpacerItem>
#include <QGridLayout>
 
FuzzyGUI::FuzzyGUI(QWidget *parent) :
   QMainWindow(parent),
   ui(new Ui::FuzzyGUI)
{
   ui->setupUi(this);
}
 
FuzzyGUI::~FuzzyGUI()
{
   delete ui;
}
 
void FuzzyGUI::on_actionExit_triggered()
{
   qApp->quit();
}
 
void FuzzyGUI::on_actionUpdates_triggered()
{
   QMessageBox updateOptions;
   updateOptions.setWindowTitle(tr("Update Checker"));
   updateOptions.setIcon(QMessageBox::Question);
   updateOptions.setText(tr("Are you sure there will be any updates?"));
   updateOptions.setStandardButtons(QMessageBox::Yes | QMessageBox::No);
   updateOptions.setDefaultButton(QMessageBox::No);
 
   // Workaround for setting QMessageBox size //
   QSpacerItem* horizontalSpacer = new QSpacerItem(300, 100, QSizePolicy::Fixed, QSizePolicy::Fixed);
   QGridLayout* layout = (QGridLayout*)updateOptions.layout();
   layout->addItem(horizontalSpacer, 0, 0, 0, 0);
 
   int userChoice = updateOptions.exec();
 
   QMessageBox choiceConfirmation;
   choiceConfirmation.setWindowTitle(tr("Update Checker"));
   choiceConfirmation.setIcon(QMessageBox::Information);
   choiceConfirmation.setStandardButtons(QMessageBox::Ok);
   if (userChoice == QMessageBox::Yes) {
       choiceConfirmation.setText(tr("Wrong guess"));
   } else {
       choiceConfirmation.setText(tr("That is correct"));
   }
 
   // Workaround for setting QMessageBox size //
   layout = (QGridLayout*)choiceConfirmation.layout();
   layout->addItem(horizontalSpacer, 0, 0, 0, 0);
 
   choiceConfirmation.exec();
}

fuzzygui.h
Код
PHP
#ifndef FUZZYGUI_H
#define FUZZYGUI_H
 
#include <QMainWindow>
 
namespace Ui {
class FuzzyGUI;
}
 
class FuzzyGUI : public QMainWindow
{
   Q_OBJECT
 
public:
   explicit FuzzyGUI(QWidget *parent = 0);
   ~FuzzyGUI();
 
private slots:
   void on_actionExit_triggered();
 
   void on_actionUpdates_triggered();
 
private:
   Ui::FuzzyGUI *ui;
};
 
#endif // FUZZYGUI_H

main.cpp
Код
PHP
#include "fuzzygui.h"
#include <QApplication>
 
int main(int argc, char *argv[])
{
   QApplication a(argc, argv);
   FuzzyGUI w;
   w.show();
 
   return a.exec();
}

Нужный размер, безусловно, устанавливается, но как только я нажимаю на кнопку во втором окне, программа падает... При этом всё нормально работает, если размер окон менять не пытаться...

Буду признателен, если кто-либо поможет проблему разрешить. Если есть более простое решение, возможно, с использованием других классов, буду признателен за подсказку.

С компиляцией проектов на моей сборке 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(). Код сейчас выглядит как-то так:
Код
PHP
#include "fuzzygui.h"
#include "ui_fuzzygui.h"
 
#include <QGridLayout>
#include <QMessageBox>
#include <QPixmap>
#include <QSpacerItem>
 
FuzzyGUI::FuzzyGUI(QWidget *parent) :
   QMainWindow(parent),
   ui(new Ui::FuzzyGUI)
{
   ui->setupUi(this);
}
 
FuzzyGUI::~FuzzyGUI()
{
   delete ui;
}
 
void FuzzyGUI::on_actionExit_triggered()
{
   qApp->quit();
}
 
void FuzzyGUI::on_actionUpdates_triggered()
{
   QMessageBox updateOptions;
   updateOptions.setWindowTitle(tr("Update Checker"));
   updateOptions.setWindowFlags(Qt::CustomizeWindowHint | Qt::WindowTitleHint);
   updateOptions.setIcon(QMessageBox::Question);
   updateOptions.setText(tr("Are you sure there will be any updates?"));
   updateOptions.setStandardButtons(QMessageBox::Yes | QMessageBox::No);
   updateOptions.setDefaultButton(QMessageBox::No);
 
   // Workaround for setting QMessageBox size //
   QSpacerItem* horizontalSpacer = new QSpacerItem(300, 100, QSizePolicy::Fixed, QSizePolicy::Fixed);
   dynamic_cast<QGridLayout*>(updateOptions.layout())->addItem(horizontalSpacer, 0, 0, 0, 0);
 
   int userChoice = updateOptions.exec();
 
   QPixmap invisibleIcon = QPixmap(1, 1);
 
   QMessageBox choiceConfirmation;
   choiceConfirmation.setWindowTitle(tr("Update Checker"));
   choiceConfirmation.setWindowIcon(QIcon(invisibleIcon));
   choiceConfirmation.setIcon(QMessageBox::Information);
   choiceConfirmation.setStandardButtons(QMessageBox::Ok);
   if (userChoice == QMessageBox::Yes) {
       choiceConfirmation.setText(tr("Wrong guess"));
   } else {
       choiceConfirmation.setText(tr("That is correct"));
   }
 
   // Workaround for setting QMessageBox size //
   horizontalSpacer = new QSpacerItem(300, 100, QSizePolicy::Fixed, QSizePolicy::Fixed);
   dynamic_cast<QGridLayout*>(choiceConfirmation.layout())->addItem(horizontalSpacer, 0, 0, 0, 0);
 
   choiceConfirmation.exec();
}
В случае с 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. обратимся к исходникам:
Код
C++ (Qt)
void QWidgetPrivate::adjustFlags(Qt::WindowFlags &flags, QWidget *w)
{
...
   if (flags & Qt::CustomizeWindowHint) {
       // modify window flags to make them consistent.
       // Only enable this on non-Mac platforms. Since the old way of doing this would
       // interpret WindowSystemMenuHint as a close button and we can't change that behavior
       // we can't just add this in.
#ifndef Q_WS_MAC
       if (flags & (Qt::WindowMinMaxButtonsHint | Qt::WindowCloseButtonHint | Qt::WindowContextHelpButtonHint)) {
           flags |= Qt::WindowSystemMenuHint;
#else
       if (flags & (Qt::WindowMinMaxButtonsHint | Qt::WindowCloseButtonHint
                    | Qt::WindowSystemMenuHint)) {
#endif
           flags |= Qt::WindowTitleHint;
           flags &= ~Qt::FramelessWindowHint;
       }
   } else if (customize && !(flags & Qt::FramelessWindowHint)) {
       // if any of the window hints that affect the titlebar are set
       // and the window is supposed to have frame, we add a titlebar
       // and system menu by default.
       flags |= Qt::WindowSystemMenuHint;
       flags |= Qt::WindowTitleHint;
   }
}


Название: 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
Так есть возможность этим порулить или как?
Так, вот этот костыль
Код
PHP
QSpacerItem* horizontalSpacer = new QSpacerItem(300, 100, QSizePolicy::Fixed, QSizePolicy::Fixed);
dynamic_cast<QGridLayout*>(updateOptions.layout())->addItem(horizontalSpacer, 0, 0, 0, 0);
именно для того и предназначен. У меня другой был вопрос совершенно.


Название: 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)