Qt的对话框与窗口--多窗口

该博客详细介绍了如何在Qt5.9环境中利用QMainWindow和QTabWidget实现多窗口和嵌入式显示功能。通过创建QFormDoc和QFormTable类对象,动态添加到主窗口的tabWidget中,或者以独立窗口形式展示,展示了Qt的窗口管理和布局管理能力。同时,代码示例展示了如何设置窗口属性,如关闭时自动删除、窗口最大化等,以及窗口显示和隐藏的控制逻辑。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

多窗口

就是在一个窗口界面上有多几个窗口。
在这里插入图片描述
    程序的主窗口类是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++开发指南》
程序中增加注释,方便理解和学习。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值