#include "mainwindow.h" #include #include #include #include #include #include #include //#define USE_STACKLAYOUT RasterWindow::RasterWindow(QWindow *parent) : QWindow(parent) , m_backingStore(new QBackingStore(this)) { setGeometry(100, 100, 300, 200); setOpacity(0.5); } bool RasterWindow::event(QEvent *event) { if (event->type() == QEvent::UpdateRequest) { renderNow(); return true; } return QWindow::event(event); } void RasterWindow::renderLater() { requestUpdate(); } void RasterWindow::resizeEvent(QResizeEvent *resizeEvent) { m_backingStore->resize(resizeEvent->size()); } void RasterWindow::exposeEvent(QExposeEvent *) { if (isExposed()) renderNow(); } void RasterWindow::renderNow() { if (!isExposed()) return; QRect rect(0, 0, width(), height()); m_backingStore->beginPaint(rect); QPaintDevice *device = m_backingStore->paintDevice(); QPainter painter(device); painter.fillRect(0, 0, width(), height(), QGradient::NightFade); render(&painter); painter.end(); m_backingStore->endPaint(); m_backingStore->flush(rect); } void RasterWindow::render(QPainter *painter) { painter->drawText(QRectF(0, 0, width(), height()), Qt::AlignCenter, QStringLiteral("QWindow")); } ColorWidget::ColorWidget(QWidget * parent) : QWidget(parent) { } void ColorWidget::setColor(const QColor &c) { m_color = c; setObjectName(m_color.name()); } void ColorWidget::paintEvent(QPaintEvent *) { QRect rc = QRect(0, 0, width() - 1, height() - 1); QPainter p(this); p.setBrush(m_color); p.setPen(m_color); p.drawRect(rc); } MainWindow::MainWindow(QWidget *parent) : QDialog(parent) { m_red = new RasterWindow; m_red_widget = QWidget::createWindowContainer(m_red, this); m_yellow= new ColorWidget(this); m_yellow->setColor(Qt::yellow); m_blue = new ColorWidget(this); m_blue->setColor(Qt::blue); m_green = new ColorWidget(this); m_green->setColor(Qt::green); //m_red_widget->hide(); m_red_widget->show(); #ifdef USE_STACKLAYOUT QStackedLayout * stack = new QStackedLayout; stack->setStackingMode(QStackedLayout::StackAll); stack->addWidget(m_red_widget); stack->addWidget(m_yellow); stack->addWidget(m_blue); stack->addWidget(m_green); stack->setCurrentWidget(m_green); setLayout(stack); m_red_widget->lower(); #endif resize(640, 480); } MainWindow::~MainWindow() { } void MainWindow::resizeEvent(QResizeEvent *event) { QDialog::resizeEvent(event); #ifdef USE_STACKLAYOUT QStackedLayout * stack = qobject_cast(layout()); qDebug() << m_red_widget << stack->indexOf(m_red_widget); qDebug() << m_yellow << stack->indexOf(m_yellow); qDebug() << m_blue << stack->indexOf(m_blue); qDebug() << m_green << stack->indexOf(m_green); #else QRect rc = QRect(0, 0, width() - 1, height() - 1); m_red->lower(); m_red_widget->setGeometry(0, 0, rc.width(), rc.height() / 2); m_red_widget->lower(); m_yellow->setGeometry(0, 0, rc.width(), rc.height() / 2); m_yellow->lower(); m_blue->setGeometry(rc.width() / 2, 0, rc.width()/2, rc.height()); m_blue->raise(); m_green->setGeometry(0, rc.height() * 3 / 4, rc.width(), rc.height() / 4); m_green->raise(); #endif } int main(int argc, char *argv[]) { QApplication a(argc, argv); MainWindow w; w.show(); return a.exec(); }