QT-空窗口主窗口对话框

news2024/11/24 16:51:37

1. QMainWindow

  • QMainWindow 用来创建主窗口

  • 主窗口包含: 标题栏(Window title)、菜单栏(MenuBar)、工具栏(ToolBar)、状态栏(StatusBar)、停靠部件(DockWidgetArea)、工作空间(Central Widget)

1.1 菜单栏

  • 菜单栏需要使用的包: QMenuBar 、 QMenu

  • QMenuBar: 用来创建菜单栏

    • addMenu:将菜单项添加到菜单栏

  • QMenu: 用来创建菜单

    • addAction: 添加动作,向菜单中添加菜单项(选择菜单项才执行具体的操作

    • addSeparator: 添加分割线

  • 其他用到的方法:

    • this->setMenuBar(xxx):该方法是 QMainWindow 提供的方法,用来将菜单栏添加到窗口

包含一、二、三级菜单示的例:

#include "mymainwindow.h"



#include <QMenu>
#include <QMenuBar>
#include <QAction>
#include <QDebug>
#include<QToolBar>
#include <QStatusBar>
#include <QLabel>
#include <QLineEdit>
#include <QPushButton>
#include <QTextEdit>
#include <QDockWidget>
MyMainWindow::MyMainWindow(QWidget *parent)
    : QMainWindow(parent)
{
    this ->setWhatsThis("主窗口测试");
    this->resize(500,300);
    1.菜单栏/
    //1.实例化菜单栏对象并设置到窗口上
    QMenuBar *menubar = new QMenuBar;
    this->setMenuBar(menubar);

    //2) 创建一级菜单
    QMenu *fileMenu = menubar->addMenu("文件");
    //menubar->addMenu("文件");
    QMenu *editMenu = menubar->addMenu("编辑");
    QMenu* debugMenu = menubar->addMenu("调式");
    QMenu* toolMenu = menubar->addMenu("工具");


    //3)创建二级菜单
    //没有子菜单的菜单项都能点击操作,统统都叫做Action
    //有子菜单的菜单项,鼠标放在菜单项上时,就会自动展开子菜单,都叫做Menu

    //向文件菜单中添加子菜单
    QAction *newAction = fileMenu->addAction(QIcon(":/icons/amumu.png"),"新建");
   // QAction *newAction = fileMenu->addAction("新建");
    QAction *openAction =  fileMenu->addAction(QIcon(":/icons/ashe.png"),"打开");
    fileMenu->addSeparator();
    QAction *exitAction = fileMenu->addAction(QIcon(":/icons/jax.png"),"退出");

    toolMenu->addAction("locket");
    QMenu *outMenu = toolMenu->addMenu("外部");
    QMenu *quickMenu =  outMenu->addMenu("Qt Quick");
    quickMenu->addAction("aaa");
    quickMenu->addAction("bbb");
    QMenu *yuyanMenu =  outMenu->addMenu("Qt预言家");
    yuyanMenu->addAction("ccc");
    QMenu *wenbenMenu =  outMenu->addMenu("文本");
    wenbenMenu->addAction("ddd");
    outMenu->addSeparator();
    QMenu *configMenu =  outMenu->addMenu("config");
    configMenu->addAction("123");

    toolMenu->addSeparator();
     toolMenu->addAction("选项");





    editMenu->addAction("Undo");
    editMenu->addAction("Redo");
    editMenu->addSeparator();
    editMenu->addAction("全选");

    //链接action的信号和槽
    connect(newAction, &QAction::triggered,[](){
        qDebug() << "准备新建文件";
    });
    connect(openAction,&QAction::triggered,[](){
        qDebug() << "打开文件";
    });
    connect(exitAction,&QAction::triggered, this, &QMainWindow::close);

    //创建三级菜单
    debugMenu->addAction("脱离调试");
    //创建带有子菜单的菜单项
    QMenu *startMenu= debugMenu->addMenu(QIcon(":/icons/vn.png"),"开始调试");
    startMenu->addAction("start debug");
    startMenu->addAction("忽略");
    startMenu->addSeparator();
     startMenu->addAction("关联");


}

MyMainWindow::~MyMainWindow()
{

}

三级菜单结构图:

  1. 创建菜单栏,并将菜单栏添加到窗口上

QMenuBar *menuBar = new QMenuBar;

this->setMenuBar(menuBar);

  1. 创建一个可以点击的菜单项时,调用 addAction

  2. 创建一个可以包含子菜单的菜单项时,调用 addMenu 方法

QMenu *level_1 = menuBar->addMenu("一级菜单");

level_1->addAction("可以点击的二级菜单");

QMenu *level_2 = level_1->addMenu("可以包含三级菜单的菜单");

level_2->addAction(..) ; level_2->addMenu(....)

1.2 为action增加信号

  • QAction 类可以保存 addAction 得到的对象

  • QAction 提供了 triggered 信号,点击时会触发

#include <QMenuBar>
#include <QMenu>
#include <QAction>


// 创建菜单栏
QMenuBar *bar = new QMenuBar;
this->setMenuBar(bar);

// 配置一级菜单
QMenu *fileMenu = bar->addMenu("文件");
fileMenu->addAction("新建");
fileMenu->addSeparator();
// 使用 QAction 类保存 addAction 得到的对象
QAction *exitAction = fileMenu->addAction("退出");

// 配置 信号 和 槽  --->  退出功能
connect(exitAction, &QAction::triggered, this, &QWidget::close);

1.3 QIcon

QIcon 用来创建图标,图标就是图片

在项目中使用 QIcon 首先要将 QIcon 加入到项目中

1.3.1 向项目中增加资源

1.将图片保存到项目目录下

2. 以资源形式将图片添加到项目中

3.添加前缀 和 资源图片

1.3.2 在菜单中设置图标

  • QIcon("图标地址")

    • 地址格式:绝对路径 或者 资源路径

    • 资源路径以 : 开头

  • addMenu(QIcon, title);

  • addAction(QIcon, title);

  • 注意事项:如果给一级菜单设置图标,则不显示文字只显示图标

// 带图标菜单
// 一级菜单只显示图片,不显示文字
QMenu *help = bar->addMenu(QIcon(":/icon/sound0.png"), "帮助");
help->addAction(QIcon(":/icon/sound1"), "关于我们");
QMenu *help_l1 = help->addMenu(QIcon("E:/c++/QT/qt-3/exp/01_main_1/icon/search.png"), "联系我们");
help_l1->addAction(QIcon(":/icon/save.png"), "QQ");
help_l1->addAction(QIcon(":/icon/saveAs.png"), "微信");

1.4 工具栏

  • QToolBar: 工具栏类

    • this->addToolBar(xxx): 该方法是 QMainWindow 提供的方法,用来将工具栏添加到窗口中

  • 核心方法: addAction

    • 由于工具栏中的操作项基本都和菜单栏中的操作项一样(快捷方式),所以可以调用 addAction 方法将菜单栏中的对应项直接方进去

  • QToolBar 其他常用方法:

    • setAllowedAreas(位置):配置工具栏显示的位置,默认显示在上方,并且能够在上下左右移动

      • Qt::LeftToolBarArea : 显示在窗口左侧

      • Qt::RightToolBarArea : 显示在窗口左侧

      • Qt::TopToolBarArea : 显示在窗口左侧

      • Qt::BottomToolBarArea : 显示在窗口左侧

    • setFloatable(true/false): 设置工具栏是否能浮动

    • setMovable(true/false): 设置工具栏是否允许在上下左右移动

    • addSeparator(): 设置分割线

  • 按钮也能设置到工具栏中

    • toolBar->addWidget(xxx);

// 工具栏
// 创建工具栏
QToolBar *toolBar = new QToolBar;
// 将工具栏添加到主窗口
this->addToolBar(toolBar);
// 配置工具栏能够显示的位置, 默认上下左右, 此处设置为 左右
toolBar->setAllowedAreas(Qt::LeftToolBarArea | Qt::RightToolBarArea);
// 禁止工具栏浮动
toolBar->setFloatable(false);
// 禁止工具栏移动
toolBar->setMovable(false);

toolBar->addAction("新建");
toolBar->addSeparator();
toolBar->addAction(open);

// 在工具栏中添加按钮
QPushButton *print = new QPushButton;
print->setText("打印");
toolBar->addWidget(print);

1.5 状态栏

  • QStatusBar:状态栏类

    • this->setStatusBar(xxx):该方法是 QMainWindow 提供的方法,用来将状态栏添加到窗口下方

    • addWidget(widget):将状态信息添加到左侧

    • addPermanentWidget(widget): 将状态信息添加到右侧

QStatusBar * stBar = new QStatusBar;
this->setStatusBar(stBar);

QLabel *baseInfo = new QLabel("基础信息", this);
stBar->addWidget(baseInfo);

QLabel *countInfo = new QLabel("统计信息", this);
stBar->addPermanentWidget(countInfo);

1.6 中心部件

  • setCentralWidget(): 该方法是 QMainWindow 提供的方法,用来将中心部件添加到窗口

 // 配置中心部件
QTextEdit *txt = new QTextEdit(this);
this->setCentralWidget(txt);

1.7 铆接部件

  • QDockWidget: 铆接部件类

    • this->addDockWidget: QWidget 提供的方法,将铆接部件添加到窗口

    • setAllowedAreas: 设置铆接部件能够停靠的位置

// 配置铆接部件
QDockWidget * dw = new QDockWidget("标题", this);
this->addDockWidget(Qt::LeftDockWidgetArea, dw);
dw->setAllowedAreas(Qt::LeftDockWidgetArea | Qt::RightDockWidgetArea);

2. ui 方式操作 MainWindow

2.1 创建项目

创建项目时勾选 "创建界面"

 增加了 .ui 文件,内部是 xml 文档形式描述UI结构选择 "设计" 时,显示UI结构,可以使用 拖拽方式来设计UI.pro 文件增加了 .ui 文件的配置

2.2 菜单栏

1.创建菜单栏

注意事项:

  • 添加菜单时,建议先写英文,再改为中文。 使用英文方便创建对应的对象

    • 文件 ---> menufile

    • 编辑 ---> menuedit

    • 查看 ---> menuview

    • help ---> 帮助

2.增加二级菜单 

将二级菜单修改为中文显示

3.增加三级菜单 

2.3 工具栏

  • 在一个窗口中可以有多个工具栏

  • 可以将 actionXxx 直接拖拽到工具栏

2.4 状态栏&铆接

状态栏和铆接部件只能手写

2.5 中心部件

将部件拖拽到中心区域即可

3. 其他对话框

3.1 QMessageBox

QMessageBox 是一种消息对话框,能够对用户的操作进行提示。

静态方法:

  • 基础提示: QMessageBox::about(参数1, 参数2, 参数3)

  • 信息提示:QMessageBox::information(参数1, 参数2, 参数3, 参数4, 参数5)

  • 警告提示:QMessageBox::warning(参数1, 参数2, 参数3, 参数4, 参数5)

  • 错误提示:QMessageBox::critical(参数1, 参数2, 参数3, 参数4, 参数5)

  • 询问提示:QMessageBox::question(参数1, 参数2, 参数3, 参数4, 参数5)

    • 参数1: 父控件

    • 参数2: 标题栏提示信息

    • 参数3: 主提示信息

    • 参数4: 按钮设置 (注意:每一种messagebox都有默认的按钮;如果默认的按钮不够用或者不合适可以进行修改)

    • 参数5: 默认选中按钮

// 关于
connect(ui->aboutBtn, &QPushButton::clicked, [=](){
  QMessageBox::about(this, "关于", "关于提示信息");
});

// 消息提示框
connect(ui->infoBtn, &QPushButton::clicked, [=](){
  QMessageBox::information(this, "提示", "这是一个提示信息");
});

// 警告提示框
connect(ui->warnBtn, &QPushButton::clicked, [=](){
  QMessageBox::warning(this, "警告", "这是一个严重警告框");
});

// 错误提示框
connect(ui->errBtn, &QPushButton::clicked, [=](){
  QMessageBox::critical(this, "错误", "这是一个严重错误");
});

// 问题询问框
connect(ui->questionBtn, &QPushButton::clicked, [=](){
  QMessageBox::question(this, "询问", "你选yes 还是 no", QMessageBox::Ok|QMessageBox::Cancel, QMessageBox::Cancel);
});

3.2 中文按钮

使用构造函数创建按钮

// 使用 QMessageBox 构造函数创建提示框
QMessageBox myBox(
  QMessageBox::Question, 
  "努力脱单", 
  "你愿意嫁给我吗!", 
  QMessageBox::Yes| QMessageBox::No
);

// 设置按钮文字
myBox.setButtonText(QMessageBox::Yes, "愿意");    //方式1
myBox.button(QMessageBox::No)->setText("滚蛋");   //方式2


int Ret = myBox.exec();     // 获取点击的按钮
if(Ret == QMessageBox::Yes) //通过判断返回值确定用户点击了愿意还是滚蛋。
{
  qDebug() << "太好了!";
}
else if(Ret == QMessageBox::No)
{
  qDebug() << "滚犊子";
}

3.3 文件选择框

QFileDialog 类能弹出一个文件选择框

静态方法:

  • getOpenFileName(参数1, 参数2, 参数3, 参数4) : 打开文件

  • getSaveFileName(参数1,参数2,参数3,参数4) : 保存文件

    • 参数1: 父组件

    • 参数2:标题栏文本

    • 参数3:打开的文件夹

    • 参数4:过滤的文件类型, 如果过滤多种文件类型,需要使用 ;; 进行分割

    • 返回值: 选择的文件的绝对路径,如果选择 "取消" 按钮则返回空

  • getExistingDirectory(参数1, 参数2, 参数3) : 打开路径

    • 参数1: 父组件

    • 参数2:标题栏文本

    • 参数3:默认打开的文件夹

  • 返回值: 选中的目录的绝对路径

打开文件

// 文件对话框
connect(ui->fileBtn, &QPushButton::clicked, [=](){
  QString filePath = QFileDialog::getOpenFileName(
    this, 
    "选择文件", 
    "C:/Users/Administrator/Documents", 
    "*.txt;;*.jpg;;*.png"
  );
  qDebug() << filePath;
});

保存文件

connect(ui->saveBtn, &QPushButton::clicked, [=](){
  QString filePath = QFileDialog::getSaveFileName(this, "保存", "./", "*.txt");
  qDebug() << filePath;
});

打开目录

connect(ui->dirBtn, &QPushButton::clicked, [=](){
  QString dirPath = QFileDialog::getExistingDirectory(this, "打开目录", "e:/c++/QT");
  qDebug() << dirPath;

});

3.4 颜色选择器

  • QColorDialog 类能够弹出一个颜色选择框

  • 静态方法:

    • getColor(QColor)

  • QColor(red, green, blue, alpha) 类用来设置颜色

    • red() \ green() \ blue() : 获取红色、绿色、蓝色 的色值

// 颜色选择器
connect(ui->colorBtn, &QPushButton::clicked, [=](){
  // 方式一:   打开颜色选择器
  //  getColor() : 空参时 默认选中白色
  QColor color = QColorDialog::getColor();

  // 设置:初始值
  // QColor(red, green, blue);
  QColor color = QColorDialog::getColor(QColor(123, 255, 89));

  qDebug() << color.red() << color.green() << color.blue() << color.alpha();
  
});

connect(ui->colorBtn, &QPushButton::clicked, [=](){
	// 方式二:
  QColorDialog colorDia(Qt::cyan);   // 打开颜色选择器,指定默认颜色
  colorDia.setOption(QColorDialog::ShowAlphaChannel);  // 显示透明度选项
  colorDia.exec();

  // 当点击确定按钮时获取的颜色
  QColor color = colorDia.currentColor();
});

3.5 字体选择器

  • QFontDialog 类能够弹出一个字体选择框

  • 静态方法:

    • getFont(bool)

    • getFont(bool, QFont())

  • QFont 方法

    • setFamily() \ family() : 设置 \ 获取 文本字体

    • setPointSize() \ pointSize() : 设置 \ 获取 字体大小

    • setBold(bool) \ bold() : 设置 \ 获取 文字是否加粗

    • setItalic(bool) \ italic() : 设置 \ 获取 文字是否倾斜

connect(ui->fontBtn, &QPushButton::clicked, [=](){
  // 方式一: 弹出字体选择框,所有均为默认值
  bool flag;   // 保存用户最终点击的是 确定 还是 取消
  QFont font = QFontDialog::getFont(&flag);
  qDebug() << font.family() << font.pointSize() << font.bold() << font.italic();
  qDebug() << flag;
});


connect(ui->fontBtn, &QPushButton::clicked, [=](){
  // 方式二: 弹出字体选择框,并设置默认值
  bool flag;
  QFont font = QFontDialog::getFont(&flag, QFont("微软雅黑", 20, true, true));
  qDebug() << font.family() << font.pointSize() << font.bold() << font.italic();
  qDebug() << flag;
});

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2197033.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

你真的了解ChatGPT吗?深度解读Chat GPT背后的数据风险

随着人工智能技术的快速发展&#xff0c;像ChatGPT这样的语言模型已经成为了我们生活和工作的得力助手。从撰写文章、回答问题到辅助编程&#xff0c;ChatGPT正逐渐改变着人们与科技互动的方式。然而&#xff0c;随着AI的广泛应用&#xff0c;数据安全也成为了不可忽视的重要议…

Maven 父子模块的 pom.xml 文件编写

今天在写课内的实验作业的时候&#xff0c;三个内容要使用的依赖是一样的&#xff0c;于是想使用父子模块来玩玩。 父模块 pom.xml 书写 打包方式 <packaging>pom</packaging> 聚合子模块 <!-- 聚合子模块 --> <modules><module>../one</…

双十一即将来临,希喂、有哈、安德迈宠物空气净化器攻略赶快收好

国庆长假结束&#xff0c;也就告别了今年最后一个法定节假日。不过&#xff0c;随之而来的就是购物狂欢节双十一&#xff01;想想还有点小激动&#xff0c;这是我工作以来第一个双十一。以前在大学靠生活费根本买不了什么&#xff0c;现在工作了有点小钱&#xff0c;准备大买特…

全网都在找的Python生成器竟然在这里!简单几步,让你的代码更简洁、更高效!

博客主页&#xff1a;长风清留扬-CSDN博客系列专栏&#xff1a;Python基础专栏每天更新大数据相关方面的技术&#xff0c;分享自己的实战工作经验和学习总结&#xff0c;尽量帮助大家解决更多问题和学习更多新知识&#xff0c;欢迎评论区分享自己的看法感谢大家点赞&#x1f44…

【漏洞复现】网动统一通信平台/网动统一通信平台ActiveUC存在任意文件下载

》》》产品描述《《《 网动统一通信平台是采用统一的通信界面&#xff0c;将VoIP电话系统、电子邮件等多种沟通方式融合的企业IT平台。 》》》漏洞描述《《《 网动统一通信平台是采用统一的通信界面&#xff0c;将VoIP电话系统、电子邮件等多种沟通方式融合的企业IT平台。网动统…

OXO:一款针对Orchestration框架的安全扫描引擎

关于OXO OXO是一款针对Orchestration框架的安全扫描引擎&#xff0c;该工具可以帮助广大研究人员检测Orchestration安全问题&#xff0c;并执行网络侦查、 枚举和指纹识别等操作。 值得一提的是&#xff0c;OXO还提供了数十种其他的协同工具&#xff0c;包括网络扫描代理&…

js拼接html代码在线工具

具体请前往&#xff1a;在线Html转Js--将Html代码转成javascript动态拼接代码并保持原有格式

【基础篇】一个键值数据库包含什么?

背景 今天&#xff0c;在构造这个简单的键值数据库时&#xff0c;我们只需要关注整体架构和核心模块。这就相当于医学上在正式解剖人体之前&#xff0c;会先解剖一只小白鼠。我们通过剖析这个最简单的键值数据库&#xff0c;来迅速抓住学习和调优 Redis 的关键。 我们把这个简…

python中字符串操作

1、遍历字符串&#xff1a; pystr"HelloPython!" for i in pystr:print(i) 结果&#xff1a; 2、字符串索引 pystr"HelloPython!" print(pystr[0],pystr[-1]) 结果&#xff1a; 3、字符串切片 pystr"HelloPython!" # 切片[start:stop:step] p…

父组件向子组件传值props

父组件 <template><child :list"list" /><h4>{{ title }}</h4> </template> <script> // 引用子组件 import child from ./child.vue export default {data() {return {title: APP根组件,list: [a1, a2, a3]}},// 组件注册compo…

2024电动车新国标是什么标准

9月19日&#xff0c;工业和信息化部会同多部门&#xff0c;对最新修订的《电动自行车安全技术规范》进行公开征求意见&#xff0c;将持续1个月。与现行标准相比&#xff0c;这次的“新国标”做了哪些方面的改进和提升&#xff1f;事关你出行自由顺畅的“小电驴”&#xff0c;快…

【C语言】猜数字小游戏

&#x1f602;个人主页: 起名字真南 &#x1f923;个人专栏:【数据结构初阶】 【C语言】 【C】 目录 1 随机数的生成1.1 rand1.2 srand1.3 time1.4 设置随机数范围 2 猜数字游戏实现 前言&#xff1a;我们学习完前面的循环以后可以写一个猜数字小游戏 1 随机数的生成 想要完成…

假鞋检测分割系统源码&数据集分享

假鞋检测分割系统源码&#xff06;数据集分享 [yolov8-seg-C2f-DiverseBranchBlock&#xff06;yolov8-seg-C2f-SCConv等50全套改进创新点发刊_一键训练教程_Web前端展示] 1.研究背景与意义 项目参考ILSVRC ImageNet Large Scale Visual Recognition Challenge 项目来源AAA…

C++11--默认成员函数控制 模板的可变参数

默认成员函数 之前学习C类中&#xff0c;有6个默认成员函数&#xff1a; 构造函数析构函数拷贝构造函数拷贝赋值重载取地址重载const 取地址重载 最重要的是前4个&#xff0c;默认成员函数就是我们不写编译器会生成一个默认的。在C11中新增了两个函数&#xff1a;移动构造函…

MySQL连接:内连接

先看我的表结构 dept表 emp表 内连接分为两个连接方式 1.隐式内连接 2.显式内连接 1.隐式内连接 基本语法 select 字段列表 FROM 表1, 表2 WHERE 条件... ;例子&#xff1a;查询每一个员工的姓名&#xff0c;及关联的部门的名称&#xff08;隐式内连接实现&#xff09; …

Pikachu-url重定向-不安全的url跳转

不安全的url跳转 不安全的url跳转问题可能发生在一切执行了url地址跳转的地方。如果后端采用了前端传进来的(可能是用户传参,或者之前预埋在前端页面的url地址)参数作为了跳转的目的地,而又没有做判断的话就可能发生"跳错对象"的问题。 url跳转比较直接的危害是: …

LSTM模型变种

LSTM模型变种 一、GRU 1.什么是GRU GRU&#xff08;Gated Recurrent Unit&#xff09;是一种循环神经网络&#xff08;RNN&#xff09;的变体&#xff0c;它被设计用来解决传统RNN在处理长序列时可能遇到的梯度消失或梯度爆炸问题。GRU通过引入门控机制来控制信息的流动&…

PCL 计算点云的高斯曲率

目录 一、概述 1.1原理 1.2实现步骤 1.3应用场景 二、代码实现 2.1关键函数 2.1.1 法向量计算 2.1.2 主曲率和高斯曲率计算 2.1.3 可视化函数 2.2完整代码 三、实现效果 PCL点云算法汇总及实战案例汇总的目录地址链接&#xff1a; PCL点云算法与项目实战案例汇总&a…

1000万元试水,看完AI约稿平台上赚钱的故事,真的心动了……

在生成对抗网络&#xff08;GAN&#xff09;、扩散模型&#xff08;Diffusion Models&#xff09;、视觉语言预训练模型&#xff08;CLIP&#xff09;等技术的发展下&#xff0c;AI 绘画可做的内容越来越多。 建筑设计、服装设计、室内设计、插画设计等垂类模型的出现也让更多…

从理论到实践:AI智能分析网关V4烟火检测算法的应用场景探索

在信息化和智能化的今天&#xff0c;AI智能分析网关V4作为一款集成了先进技术的硬件设备&#xff0c;在烟火检测领域展现出了强大的应用价值。本文将详细阐述AI智能分析网关V4烟火检测算法的原理及其在各种场景中的应用。 一、AI智能分析网关V4烟火检测算法原理 深度学习基础…