多窗口
就是在一个窗口界面上有多几个窗口。
程序的主窗口类是QWMainWindow,从QMainWindow继承。主窗口有一个工具栏,4个创建窗体的按钮以不同方式创建和使用窗体。主窗体工作区绘制一个背景图片,有一个tabWidget组件,作为创建窗体的父窗体。没有子窗体时,tabWidget不显示。
代码如下:
QWMainWindow::QWMainWindow(QWidget *parent) : QMainWindow(parent),
ui(new Ui::QWMainWindow)
{
ui->setupUi(this);
ui->tabWidget->setVisible(false);
ui->tabWidget->clear();//清除所有页面
ui->tabWidget->setTabsClosable(); //Page有关闭按钮,可被关闭
this->setCentralWidget(ui->tabWidget);
this->setWindowState(Qt::WindowMaximized); //窗口最大化显示
}
void QWMainWindow::paintEvent(QPaintEvent *event)
{ //绘制窗口背景图片
Q_UNUSED(event);
QPainter painter(this);
painter.drawPixmap(0,ui->mainToolBar->height(),this->width(),
this->height()-ui->mainToolBar->height()-ui->statusBar->height(),
QPixmap(":/images/images/back.jpg"));
}
主要实现的功能是,利用tabWidget来显示嵌入式的QWidget窗口和QMainWindown窗口。还有独立窗口显示QWidget窗口和QMainWindown窗口。
设置显示的方式
主窗口工具栏上的“嵌入式Widget”按钮的响应代码如下:
void QWMainWindow::on_actWidgetInsite_triggered()
{ //创建QFormDoc窗体,并在tabWidget中显示
QFormDoc *formDoc = new QFormDoc(this);
formDoc->setAttribute(Qt::WA_DeleteOnClose); //关闭时自动删除
int cur=ui->tabWidget->addTab(formDoc,
QString::asprintf("Doc %d",ui->tabWidget->count()));
ui->tabWidget->setCurrentIndex(cur);
ui->tabWidget->setVisible(true);
}
这段代码动态创建一个QFormDoc类对象formDoc,并设置其为关闭时删除。然后使用QTabWidget的addTab()函数,为主窗口上的tabWidget新建一个页面,作为formDoc的父窗体组件,formDoc就在新建的页面里显示,我们称这种窗体显示方式为“嵌入式”。
主窗口工具栏上的“独立Widget窗口”按钮响应代码如下:
void QWMainWindow::on_actWidget_triggered()
{
QFormDoc *formDoc = new QFormDoc();
formDoc->setAttribute(Qt::WA_DeleteOnClose); //关闭时自动删除
formDoc->setWindowTitle("基于QWidget的窗体,无父窗口,关闭时删除");
formDoc->setWindowFlag(Qt::Window,true);
// formDoc->setWindowFlag(Qt::CustomizeWindowHint,true);
// formDoc->setWindowFlag(Qt::WindowMinMaxButtonsHint,false);
// formDoc->setWindowFlag(Qt::WindowCloseButtonHint,true);
// formDoc->setWindowFlag(Qt::WindowStaysOnTopHint,true);
formDoc->setWindowOpacity(0.9);
// formDoc->setWindowModality(Qt::WindowModal);
formDoc->show(); //在单独的窗口中显示
}
主窗口工具栏上的“嵌入式MainWindow”按钮的响应代码如下:
void QWMainWindow::on_actWindowInsite_triggered()
{
QFormTable *formTable = new QFormTable(this);
formTable->setAttribute(Qt::WA_DeleteOnClose); //关闭时自动删除
int cur=ui->tabWidget->addTab(formTable,
QString::asprintf("Table %d",ui->tabWidget->count()));
ui->tabWidget->setCurrentIndex(cur);
ui->tabWidget->setVisible(true);
}
主窗口工具栏上的“独立MainWindow窗口”按钮响应代码如下:
void QWMainWindow::on_actWindow_triggered()
{
QFormTable* formTable = new QFormTable(this);
formTable->setAttribute(Qt::WA_DeleteOnClose);
formTable->setWindowTitle("基于QMainWindow的窗口,指定父窗口,关闭时删除");
formTable->show();
}
说明:
程序参考于《Qt 5.9 C++开发指南》
程序中增加注释,方便理解和学习。