【qt】多窗口开发

多窗口开发

一.应用场景

多窗口,顾名思义,有多个窗口可以供我们进行操作!

截个小图,你应该就知道了

OK,话不多说,直接开干,先来设计我们的主窗口

需要蔬菜的可以dd我...

运行结果:

运行结果有点拉,我们来把tabWidget设置为中心组件.

cpp 复制代码
#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;
}

运行结果:

但是刚刚我们添加的关闭按钮不能真正的进行关闭,当点击X的时候,会发出一个信号

可以去tabWidget 里面去找!

现在我们可以去添加一个槽函数,来实现真正的关闭功能

cpp 复制代码
private slots:
    //按照转到槽的格式 on_发送者_信号 的格式来写会自动的关联,不用我们手动的关联
    void on_tabWidget_tabCloseRequested(int index);

槽函数的实现:

cpp 复制代码
void MainWindow::on_tabWidget_tabCloseRequested(int index)
{
    QWidget* widget=ui->tabWidget->widget(index);//拿到widget
    widget->close();//进行关闭
}

当我们后面进行添加了窗口,再来测试这个关闭功能.

二.嵌入的窗口

1.设计Widget窗口

然后添加好action

因为这是widget 不是mainwindow所有不能添加工具栏,但是我们可以通过代理来进行添加,代码是万能的!

cpp 复制代码
#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.创建窗口

注意添加头文件

cpp 复制代码
    FormWidget *form=new FormWidget(this);
    form->setAttribute(Qt::WA_DeleteOnClose);//关闭的时候同时销毁

3.添加窗口

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

4.总代码

cpp 复制代码
#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);//设置为添加的页面窗口
}

运行结果;

里面具体的功能不做实现,我们主要是演示多窗口的用法!

三.独立的窗口

1.创建窗口

cpp 复制代码
FormWidget *form=new FormWidget(this);
    form->setAttribute(Qt::WA_DeleteOnClose);//关闭的时候同时销毁

2.显示窗口

cpp 复制代码
void MainWindow::on_action_WidgetIndent_triggered()
{
    FormWidget *form=new FormWidget(this);
    form->setAttribute(Qt::WA_DeleteOnClose);//关闭的时候同时销毁
    
    form->show();//以非模态的方式显示
}

运行结果:

这样会出现问题,所以我们要对widget窗口设置标记,使其有对话框的摸样.

cpp 复制代码
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();//以非模态的方式显示
}

运行结果:

四.总结

多窗口其实是比较简单的,主要是设计好,显示的方式确定好,就可以了!

小彩蛋:

有没有点熊猫烧香 的感觉,这就是多窗口

没什么好的句子,哈哈

相关推荐
夜夜敲码8 分钟前
C语言教程(十六): C 语言字符串详解
c语言·开发语言
cooldream20099 分钟前
深入理解MVP架构:让UI层与业务逻辑完美分离的设计模式
ui·设计模式·架构·系统架构师
帅云毅9 分钟前
Web3.0的认知补充(去中心化)
笔记·学习·web3·去中心化·区块链
豆豆10 分钟前
day32 学习笔记
图像处理·笔记·opencv·学习·计算机视觉
拖孩12 分钟前
【Nova UI】十一、组件库中 Icon 组件的测试、使用与全局注册全攻略
前端·javascript·vue.js·ui·sass
宋康14 分钟前
C语言结构体和union内存对齐
c语言·开发语言
꧁坚持很酷꧂20 分钟前
Linux Ubuntu18.04下安装Qt Craeator 5.12.9(图文详解)
linux·运维·qt
居然是阿宋24 分钟前
Kotlin高阶函数 vs Lambda表达式:关键区别与协作关系
android·开发语言·kotlin
nenchoumi311931 分钟前
VLA 论文精读(十六)FP3: A 3D Foundation Policy for Robotic Manipulation
论文阅读·人工智能·笔记·学习·vln
ChoSeitaku34 分钟前
17.QT-Qt窗口-工具栏|状态栏|浮动窗口|设置停靠位置|设置浮动属性|设置移动属性|拉伸系数|添加控件(C++)
c++·qt·命令模式