自由的羽毛 发表于 2024-6-14 22:59:17

【qt】多窗口开辟

一.应用场景

多窗口,顾名思义,有多个窗口可以供我们举行操作!
截个小图,你应该就知道了
https://img-blog.csdnimg.cn/direct/ea315c15e9cb4ff0af70d4de3dcadaee.png
OK,话不多说,直接开干,先来筹划我们的主窗口
https://img-blog.csdnimg.cn/direct/2918de6f2554488184da374fa6de353a.png
必要蔬菜的可以dd我…
运行结果:
https://img-blog.csdnimg.cn/direct/5dedd40da7a64d51a7e9db93fa362c91.png
运行结果有点拉,我们来把tabWidget设置为中心组件.
#include "mainwindow.h"
#include "ui_mainwindow.h"

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);

    ui->tabWidget->clear();//清空页
    setCentralWidget(ui->tabWidget);
    setWindowState(Qt::WindowMaximized);//一运行就是最大化
    ui->tabWidget->setTabsClosable(true);//对tab添加一个关闭按钮

}

MainWindow::~MainWindow()
{
    delete ui;
}
运行结果:
https://img-blog.csdnimg.cn/direct/0da2d0d3fca4477abeb7253bb8677f41.png
但是刚刚我们添加的关闭按钮不能真正的举行关闭,当点击X的时候,会发出一个信号
可以去tabWidget里面去找!
https://img-blog.csdnimg.cn/direct/cc042f88600c48e3828c36598470b931.png
现在我们可以去添加一个槽函数,来实现真正的关闭功能
private slots:
    //按照转到槽的格式 on_发送者_信号 的格式来写会自动的关联,不用我们手动的关联
    void on_tabWidget_tabCloseRequested(int index);
槽函数的实现:
void MainWindow::on_tabWidget_tabCloseRequested(int index)
{
    QWidget* widget=ui->tabWidget->widget(index);//拿到widget
    widget->close();//进行关闭
}
当我们背面举行添加了窗口,再来测试这个关闭功能.
二.嵌入的窗口

1.筹划Widget窗口

https://img-blog.csdnimg.cn/direct/6fe433b9a3f44f18a3291197a06b4e80.png
然后添加好action
https://img-blog.csdnimg.cn/direct/ff07cb2438de4129b70d74a7eb117325.png
因为这是widget不是mainwindow全部不能添加工具栏,但是我们可以通过代理来举行添加,代码是万能的!
#include "formwidget.h"
#include "ui_formwidget.h"
#include <QToolBar>//工具栏
#include <QVBoxLayout>//水平布局

FormWidget::FormWidget(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::FormWidget)
{
    ui->setupUi(this);

    QToolBar *Bar=new QToolBar(this);
    Bar->addAction(ui->actionOpen);
    Bar->addSeparator();//添加分割线
    Bar->addAction(ui->actionFont);
    Bar->addAction(ui->actionCut);
    Bar->addAction(ui->actionCopy);
    Bar->addAction(ui->actionPaste);
    Bar->addAction(ui->actionRepeal);
    Bar->addAction(ui->actionRewire);
    Bar->addSeparator();
    Bar->addAction(ui->actionEXIT);
    Bar->setToolButtonStyle(Qt::ToolButtonTextUnderIcon);//字体显示在下
    //设置布局
    QVBoxLayout *vLayout=new QVBoxLayout(this);
    vLayout->addWidget(Bar);
    vLayout->addWidget(ui->plainTextEdit);
    this->setLayout(vLayout);//为窗口添加布局

}

FormWidget::~FormWidget()
{
    delete ui;
}
2.创建窗口

注意添加头文件
    FormWidget *form=new FormWidget(this);
    form->setAttribute(Qt::WA_DeleteOnClose);//关闭的时候同时销毁
3.添加窗口

//为tabWidget添加页面
    int ret=ui->tabWidget->addTab(form,QString::asprintf("窗口%d",ui->tabWidget->count()+1));
    ui->tabWidget->setCurrentIndex(ret);//设置为添加的页面窗口
4.总代码

#include "mainwindow.h"#include "ui_mainwindow.h"#include "formwidget.h"MainWindow::MainWindow(QWidget *parent)    : QMainWindow(parent)    , ui(new Ui::MainWindow){    ui->setupUi(this);    ui->tabWidget->clear();    setCentralWidget(ui->tabWidget);    setWindowState(Qt::WindowMaximized);//一运行就是最大化    ui->tabWidget->setTabsClosable(true);//对tab添加一个关闭按钮}MainWindow::~MainWindow(){    delete ui;}void MainWindow::on_tabWidget_tabCloseRequested(int index)
{
    QWidget* widget=ui->tabWidget->widget(index);//拿到widget
    widget->close();//进行关闭
}
void MainWindow::on_action_Widget_triggered(){    FormWidget *form=new FormWidget(this);
    form->setAttribute(Qt::WA_DeleteOnClose);//关闭的时候同时销毁
    //为tabWidget添加页面
    int ret=ui->tabWidget->addTab(form,QString::asprintf("窗口%d",ui->tabWidget->count()+1));
    ui->tabWidget->setCurrentIndex(ret);//设置为添加的页面窗口
} 运行结果;
https://img-blog.csdnimg.cn/direct/11b5a29913d94fad9b0d7694fe9c7965.png
里面详细的功能不做实现,我们主要是演示多窗口的用法!
三.独立的窗口

1.创建窗口

FormWidget *form=new FormWidget(this);
    form->setAttribute(Qt::WA_DeleteOnClose);//关闭的时候同时销毁
2.表现窗口

void MainWindow::on_action_WidgetIndent_triggered(){    FormWidget *form=new FormWidget(this);
    form->setAttribute(Qt::WA_DeleteOnClose);//关闭的时候同时销毁
      form->show();//以非模态的方式表现} 运行结果:
https://img-blog.csdnimg.cn/direct/233f1a51c9e242f0b5b5faef0ceebf3d.png
这样会出现问题,所以我们要对widget窗口设置标志,使其有对话框的摸样.
void MainWindow::on_action_WidgetIndent_triggered(){    FormWidget *form=new FormWidget(this);
    form->setAttribute(Qt::WA_DeleteOnClose);//关闭的时候同时销毁
    form->setWindowFlag(Qt::Window,true);    form->setWindowTitle("基于widget的独立窗口");    form->show();//以非模态的方式表现} 运行结果:
https://img-blog.csdnimg.cn/direct/b67c3552c0b74dc7b0066f1fca9517e8.png
四.总结

多窗口实在是比较简单的,主要是筹划好,表现的方式确定好,就可以了!
小彩蛋:
https://img-blog.csdnimg.cn/direct/5652643731004ee3bacdcae5dc2d39b3.png
有没有点熊猫烧香的感觉,这就是多窗口https://img-blog.csdnimg.cn/direct/f9403c5c423648a8beab8211b7c3ceb3.png
   没什么好的句子,哈哈

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
页: [1]
查看完整版本: 【qt】多窗口开辟