crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )


  Ответ в Трабл с QMdiArea
Введите ваше имя
Подтвердите код

Введите в поле код из 6 символов, отображенных в виде изображения. Если вы не можете прочитать код с изображения, нажмите на изображение для генерации нового кода.
 

Опции сообщения
 Включить смайлы?
Иконки сообщения
(Опционально)
                                
                                
  [ Без иконки ]
 


Последние 10 сообщений [ в обратном порядке ]
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®;
kwisp Дата 10.5.2009, 20:32
 
Цитата(kwisp @ 10.5.2009, 19:35) *
код покажешь?
Maksus Дата 10.5.2009, 20:13
 
Цитата(kwisp @ 10.5.2009, 18:35) *
Maksus,
зачем тебе delete?
попробуй ему close() сделать.

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

делал, результат тот же, остается пустое окно.
kwisp Дата 10.5.2009, 18:35
  Maksus,
зачем тебе delete?
попробуй ему close() сделать.

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

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

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

Конечно я начинающий, возможно каких-то принципов не понимаю, но общее впечатление от QMdiArea - неативное, как будто сырой продукт.
kwisp Дата 10.5.2009, 17:37
  Maksus,
что значит не работает - валится? или ничего не происходит?
Maksus Дата 9.5.2009, 23:53
  Почему может не работать ui->mdiArea->addSubWindow(widg) в слоте? В конструкторе срабатывает, а в слоте нет.
DmP Дата 9.5.2009, 16:53
 
Цитата(Maksus @ 9.5.2009, 15:02) *
Кстати, при закрытии дочернего окна (крестиком) уничтожается экземпляр класса окна или просто вызывается метод hide или ?

Если не установлен флаг Qt::WDestructiveClose у QWidget или атрибут Qt::WA_DeleteOnClose, то только прячется.
Maksus Дата 9.5.2009, 14:02
  Кстати, при закрытии дочернего окна (крестиком) уничтожается экземпляр класса окна или просто вызывается метод hide или ?
igor_bogomolov Дата 8.5.2009, 12:36
  У меня у самого тема не родная под XP стоит. В Qt Designer поведение такое же, как на картинке чуть выше у Maksus-а.
Но в disigner-е встроенном в eclipse и creator все нормально. Вот я и сделал такой вывод, что в этих IDE формы нормально отображаются в независимости от темы в Windows. Еще к этой мысли подтолкнуло то, что отображение форм там несколько отличается, т.е. нет рамок и заголовка окна, соответственно и форму таскать нельзя.
Просмотр темы полностью (откроется в новом окне)
RSS Текстовая версия Сейчас: 29.3.2024, 1:35