void tst_QWidget_window::tst_recreateWindow_QTBUG40817() { QTabWidget tab; QWidget *w = new QWidget; tab.addTab(w, "Tab1"); QVBoxLayout *vl = new QVBoxLayout(w); QLabel *lbl = new QLabel("HELLO1"); lbl->setObjectName("label1"); vl->addWidget(lbl); w = new QWidget; tab.addTab(w, "Tab2"); vl = new QVBoxLayout(w); lbl = new QLabel("HELLO2"); lbl->setAttribute(Qt::WA_NativeWindow); lbl->setObjectName("label2"); vl->addWidget(lbl); tab.show(); QVERIFY(QTest::qWaitForWindowExposed(&tab)); QWindow *win = tab.windowHandle(); win->destroy(); QWindowPrivate *p = qt_window_private(win); p->create(true); win->show(); tab.setCurrentIndex(1); }
void tst_QWidget_window::tst_updateWinId_QTBUG40681() { QWidget w; QVBoxLayout *vl = new QVBoxLayout(&w); QLabel *lbl = new QLabel("HELLO1"); lbl->setAttribute(Qt::WA_NativeWindow); lbl->setObjectName("label1"); vl->addWidget(lbl); w.setMinimumWidth(200); w.show(); QVERIFY(QTest::qWaitForWindowExposed(&w)); QCOMPARE(lbl->winId(), lbl->windowHandle()->winId()); // simulate screen change and notification QWindow *win = w.windowHandle(); w.windowHandle()->destroy(); lbl->windowHandle()->destroy(); w.windowHandle()->create(); lbl->windowHandle()->create(); QWindowPrivate *p = qt_window_private(win); p->emitScreenChangedRecursion(win->screen()); QCOMPARE(lbl->winId(), lbl->windowHandle()->winId()); }
/*! Flushes the given \a region from the specified window \a win onto the screen. Note that the \a offset parameter is currently unused. */ void QBackingStore::flush(const QRegion ®ion, QWindow *win, const QPoint &offset) { if (!win) win = window(); if (win && !qt_window_private(win)->receivedExpose) qWarning("QBackingStore::flush() called with non-exposed window, behavior is undefined"); d_ptr->platformBackingStore->flush(win, region, offset); }
void QOffscreenWindow::setGeometry(const QRect &rect) { if (window()->windowState() != Qt::WindowNoState) return; m_positionIncludesFrame = qt_window_private(window())->positionPolicy == QWindowPrivate::WindowFrameInclusive; setFrameMarginsEnabled(true); setGeometryImpl(rect); m_normalGeometry = geometry(); }
void QWidgetPrivate::setConstraints_sys() { Q_Q(QWidget); if (extra && q->windowHandle()) { QWindow *win = q->windowHandle(); QWindowPrivate *winp = qt_window_private(win); winp->minimumSize = QSize(extra->minw, extra->minh); winp->maximumSize = QSize(extra->maxw, extra->maxh); if (extra->topextra) { winp->baseSize = QSize(extra->topextra->basew, extra->topextra->baseh); winp->sizeIncrement = QSize(extra->topextra->incw, extra->topextra->inch); } if (winp->platformWindow) { fixPosIncludesFrame(); winp->platformWindow->propagateSizeHints(); } } }
void QWidgetPrivate::create_sys(WId window, bool initializeWindow, bool destroyOldWindow) { Q_Q(QWidget); Q_UNUSED(window); Q_UNUSED(initializeWindow); Q_UNUSED(destroyOldWindow); Qt::WindowFlags flags = data.window_flags; if (!q->testAttribute(Qt::WA_NativeWindow) && !q->isWindow()) return; // we only care about real toplevels QWindow *win = topData()->window; // topData() ensures the extra is created but does not ensure 'window' is non-null // in case the extra was already valid. if (!win) { createTLSysExtra(); win = topData()->window; } win->setFlags(data.window_flags); fixPosIncludesFrame(); if (q->testAttribute(Qt::WA_Moved)) win->setGeometry(q->geometry()); else win->resize(q->size()); win->setScreen(QGuiApplication::screens().value(topData()->screenIndex, 0)); if (q->testAttribute(Qt::WA_TranslucentBackground)) { QSurfaceFormat format; format.setAlphaBufferSize(8); win->setFormat(format); } if (QWidget *nativeParent = q->nativeParentWidget()) { if (nativeParent->windowHandle()) { if (flags & Qt::Window) { win->setTransientParent(nativeParent->windowHandle()); win->setParent(0); } else { win->setTransientParent(0); win->setParent(nativeParent->windowHandle()); } } } qt_window_private(win)->positionPolicy = topData()->posIncludesFrame ? QWindowPrivate::WindowFrameInclusive : QWindowPrivate::WindowFrameExclusive; win->create(); // Enable nonclient-area events for QDockWidget and other NonClientArea-mouse event processing. if ((flags & Qt::Desktop) == Qt::Window) win->handle()->setFrameStrutEventsEnabled(true); data.window_flags = win->flags(); QBackingStore *store = q->backingStore(); if (!store) { if (win && q->windowType() != Qt::Desktop) q->setBackingStore(new QBackingStore(win)); else q->setAttribute(Qt::WA_PaintOnScreen, true); } setWindowModified_helper(); setWinId(win->winId()); // Check children and create windows for them if necessary q_createNativeChildrenAndSetParent(q); if (extra && !extra->mask.isEmpty()) setMask_sys(extra->mask); // If widget is already shown, set window visible, too if (q->isVisible()) win->setVisible(true); }