Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум на CrossPlatform.RU _ Qt GUI _ Трабл с QMdiArea

Автор: Maksus 7.5.2009, 22:12

Создаю главное окно с QMdiArea.
Создаю окно-виджет на базе QWidget.
Добавляю smdi = ui->mdiArea->addSubWindow(widg);

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

Автор: Litkevich Yuriy 7.5.2009, 22:20

непонятно. Давай код (пример %QTDIR%\examples\mainwindows\mdi смотрел? Правильно отображается?)

Цитата(Maksus @ 8.5.2009, 2:12) *
Создаю окно-виджет на базе QWidget.
Добавляю smdi = ui->mdiArea->addSubWindow(widg);
ты случаем не так делаешь:
QWidget *widg = new QWidget(this);
smdi = ui->mdiArea->addSubWindow(widg);
?

Автор: Maksus 7.5.2009, 22:46

Цитата(Litkevich Yuriy @ 7.5.2009, 22:20) *
непонятно. Давай код (пример %QTDIR%\examples\mainwindows\mdi смотрел? Правильно отображается?)

Цитата(Maksus @ 8.5.2009, 2:12) *
Создаю окно-виджет на базе QWidget.
Добавляю smdi = ui->mdiArea->addSubWindow(widg);
ты случаем не так делаешь:
QWidget *widg = new QWidget(this);
smdi = ui->mdiArea->addSubWindow(widg);
?

Именно так и делаю.

Код собственно обычный при формировании нового проекта, мое только то, что написал. Объявление указателей, получение объетов в конструкторе и установка дочернего окна.

Да, при запуске готовой демки то же самое :( думал я ошибаюсь

Автор: Litkevich Yuriy 7.5.2009, 22:52

Цитата(Maksus @ 8.5.2009, 2:33) *
Именно так и делаю.
:)
И как ты себе представляешь объект QWidget?
У него впринципе нет размера. Задай ему размер.


Цитата(Maksus @ 8.5.2009, 2:46) *
Да, при запуске готовой демки то же самое
Т.е. стандартный пример тоже криво отображается? Покажи скриншот.

Автор: Maksus 7.5.2009, 22:54

Цитата(Litkevich Yuriy @ 7.5.2009, 22:52) *
Цитата(Maksus @ 8.5.2009, 2:33) *
Именно так и делаю.
:)
И как ты себе представляешь объект QWidget?
У него впринципе нет размера. Задай ему размер.


Цитата(Maksus @ 8.5.2009, 2:46) *
Да, при запуске готовой демки то же самое
Т.е. стандартный пример тоже криво отображается? Покажи скриншот.

Так если фирменная демка с таким же багом отображается...

 

Автор: Litkevich Yuriy 7.5.2009, 23:01

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

Автор: Maksus 7.5.2009, 23:50

Да, действительно, это из-за темы. Что ж делать? Неужели с Qt нельзя использовать красивые темы?

Автор: igor_bogomolov 8.5.2009, 0:30

Цитата(Maksus @ 8.5.2009, 0:50) *
Неужели с Qt нельзя использовать красивые темы?
Если использовать встроенный дизайнер в QtCreator, то можно. Там отображение нормальное.
Иначе никак. Ставь родную тему.

Автор: Litkevich Yuriy 8.5.2009, 7:39

igor_bogomolov, помоему с дизайнером такие же проблемы на XP у людей возникали. Да и по логике я не вижу, чтобы это что-то поменяло.
Ведь Qt дочерние окошки рисует сама, без участия ОСьки.

Автор: Maksus 8.5.2009, 8:09

Цитата(Litkevich Yuriy @ 8.5.2009, 7:39) *
igor_bogomolov, помоему с дизайнером такие же проблемы на XP у людей возникали. Да и по логике я не вижу, чтобы это что-то поменяло.
Ведь Qt дочерние окошки рисует сама, без участия ОСьки.

Да, я использовал Creator и проблема такая же как и в случае с демкой. Но не на всех красивых темах :) Только на VistaCG заглючило.

Автор: igor_bogomolov 8.5.2009, 12:36

У меня у самого тема не родная под XP стоит. В Qt Designer поведение такое же, как на картинке чуть выше у Maksus-а.
Но в disigner-е встроенном в eclipse и creator все нормально. Вот я и сделал такой вывод, что в этих IDE формы нормально отображаются в независимости от темы в Windows. Еще к этой мысли подтолкнуло то, что отображение форм там несколько отличается, т.е. нет рамок и заголовка окна, соответственно и форму таскать нельзя.

Автор: Maksus 9.5.2009, 14:02

Кстати, при закрытии дочернего окна (крестиком) уничтожается экземпляр класса окна или просто вызывается метод hide или ?

Автор: DmP 9.5.2009, 16:53

Цитата(Maksus @ 9.5.2009, 15:02) *
Кстати, при закрытии дочернего окна (крестиком) уничтожается экземпляр класса окна или просто вызывается метод hide или ?

Если не установлен флаг Qt::WDestructiveClose у QWidget или атрибут Qt::WA_DeleteOnClose, то только прячется.

Автор: Maksus 9.5.2009, 23:53

Почему может не работать ui->mdiArea->addSubWindow(widg) в слоте? В конструкторе срабатывает, а в слоте нет.

Автор: kwisp 10.5.2009, 17:37

Maksus,
что значит не работает - валится? или ничего не происходит?

Автор: Maksus 10.5.2009, 18:20

Цитата(kwisp @ 10.5.2009, 17:37) *
Maksus,
что значит не работает - валится? или ничего не происходит?

Ничего не происходило. Вызвал exec виджета и появилось, хотя в конструкторе и без этого все равботало, сложно объяснить такое поведение.

Теперь проблема в другом, при removeSubWindow(widg) и/или delete widg, окно остается в области, только очищаются элементы, тоесть остается просто пустая форма, такого же размера с таким же заголовком. А при закрытии крестиком, все ОК.

Конечно я начинающий, возможно каких-то принципов не понимаю, но общее впечатление от QMdiArea - неативное, как будто сырой продукт.

Автор: kwisp 10.5.2009, 18:35

Maksus,
зачем тебе delete?
попробуй ему close() сделать.

код покажешь?

Автор: Maksus 10.5.2009, 20:13

Цитата(kwisp @ 10.5.2009, 18:35) *
Maksus,
зачем тебе delete?
попробуй ему close() сделать.

код покажешь?

делал, результат тот же, остается пустое окно.

Автор: kwisp 10.5.2009, 20:32

Цитата(kwisp @ 10.5.2009, 19:35) *
код покажешь?

Автор: LS 14.5.2009, 13:42

Очередной раз вижу эту проблемку. Здесь дело в "плохом стиле". Я знаю, как это поправить - модификация qwindowsxpstyle.cpp - но на этом дело не кончится, т.к. кнопки min, max, close будут рисоваться плохо, и по моему, это уже не лечится, надо менять MDI подход в самом QT.
Поправить: QWindowsXPStyle::styleHint() case SH_WindowFrame_Mask:
заменить
mask->region = d->region(themeData);
на

SIZE sz;
    themeData = XPThemeData(widget, 0, QLatin1String("WINDOW"), WP_MINCAPTION, CS_ACTIVE, option->rect);
    if (!(titlebar->titleBarState & Qt::WindowMinimized)) {
        themeData.partId = WP_CAPTION;
        sz.cy = ::GetSystemMetrics(SM_CYCAPTION) + ::GetSystemMetrics(SM_CXSIZEFRAME);
        themeData.rect.setHeight(sz.cy);
    }
    else
        sz.cy = themeData.rect.height();
    mask->region = d->region(themeData);
    QRect r(mask->region.boundingRect());
    if (0 > (sz.cx = sz.cy - r.height())) {
        r.setHeight(sz.cy);
        mask->region &= QRegion®;
        sz.cx = 0;
    }
    if (sz.cx += option->rect.top() - r.top())
        mask->region.translate(0, sz.cx);
    r = option->rect;
    r.setTop(r.top() + sz.cy);

    if (!(titlebar->titleBarState & Qt::WindowMinimized)) {
        themeData.partId = WP_FRAMEBOTTOM;
        themeData.rect.setBottom(r.bottom());
        if (SUCCEEDED(pGetThemePartSize(themeData.handle(), 0, themeData.partId, themeData.stateId, 0, TS_TRUE, &sz))) {
            themeData.rect.setTop(r.bottom() - sz.cy + 1);
            r.setBottom(r.bottom() - sz.cy);
        }
        mask->region |= d->region(themeData);

        themeData.partId = WP_FRAMELEFT;
        themeData.rect = r;
        if (SUCCEEDED(pGetThemePartSize(themeData.handle(), 0, themeData.partId, themeData.stateId, 0, TS_TRUE, &sz))) {
            themeData.rect.setWidth(sz.cx);
            r.setLeft(r.left() + sz.cx);
        }
        mask->region |= d->region(themeData);

        themeData.partId = WP_FRAMERIGHT;
        themeData.rect.setRight(r.right());
        if (SUCCEEDED(pGetThemePartSize(themeData.handle(), 0, themeData.partId, themeData.stateId, 0, TS_TRUE, &sz))) {
            themeData.rect.setLeft(r.right() - sz.cx + 1);
            r.setRight(r.right() - sz.cx);
        }
        mask->region |= d->region(themeData);
    }

    mask->region &= QRegion(option->rect);
    if (!r.isEmpty())
        mask->region |= QRegion®;

Форум Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)