Создаю главное окно с QMdiArea.
Создаю окно-виджет на базе QWidget.
Добавляю smdi = ui->mdiArea->addSubWindow(widg);
Отображается только часть окна, область размером с заголовок этого дочернего окна. Через эту область перемещая окно можно посмотреть его полностью, оно прорисовано правильно. Но почему отображается только часть окна через этот четырехугольник, как показать всё? Помогите, плиз.
непонятно. Давай код (пример %QTDIR%\examples\mainwindows\mdi смотрел? Правильно отображается?)
QWidget *widg = new QWidget(this);
smdi = ui->mdiArea->addSubWindow(widg);
?
QWidget *widg = new QWidget(this);
smdi = ui->mdiArea->addSubWindow(widg);
?Попробуй установить тему оформления самого виндовоза в "стандартную", вроде был такой глюк.
Да, действительно, это из-за темы. Что ж делать? Неужели с Qt нельзя использовать красивые темы?
igor_bogomolov, помоему с дизайнером такие же проблемы на XP у людей возникали. Да и по логике я не вижу, чтобы это что-то поменяло.
Ведь Qt дочерние окошки рисует сама, без участия ОСьки.
У меня у самого тема не родная под XP стоит. В Qt Designer поведение такое же, как на картинке чуть выше у Maksus-а.
Но в disigner-е встроенном в eclipse и creator все нормально. Вот я и сделал такой вывод, что в этих IDE формы нормально отображаются в независимости от темы в Windows. Еще к этой мысли подтолкнуло то, что отображение форм там несколько отличается, т.е. нет рамок и заголовка окна, соответственно и форму таскать нельзя.
Кстати, при закрытии дочернего окна (крестиком) уничтожается экземпляр класса окна или просто вызывается метод hide или ?
Почему может не работать ui->mdiArea->addSubWindow(widg) в слоте? В конструкторе срабатывает, а в слоте нет.
Maksus,
что значит не работает - валится? или ничего не происходит?
Maksus,
зачем тебе delete?
попробуй ему close() сделать.
код покажешь?
Очередной раз вижу эту проблемку. Здесь дело в "плохом стиле". Я знаю, как это поправить - модификация 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)