• c++学习26qt(二)


    QMainWindow

    概述

    QMainWindow类提供一个带有菜单条,工具条和一个状态条的主应用程序窗口。主窗口通常提供一个大的中央窗口部件,以及周围菜单,工具条,和一个状态栏。QMainWindow窗口经常被继承,使得封装中央部件,菜单,工具条,状态栏等都变得很容易,当用户点击它的时候,相应的槽就会被调用。

    菜单栏

    1. 创建菜单栏(菜单栏只有一个)
    2. 将菜单栏设置到窗口
    3. 添加菜单(利用菜单栏添加菜单)
    4. 添加菜单项(在菜单点击时弹出的是菜单项)
    5. 添加分割线
        //1.创建菜单栏
        QMenuBar *bar = menuBar();
        //2.将菜单栏设置到窗口中
        setMenuBar(bar);
    
        //添加菜单
        QMenu *fileMenu = bar->addMenu("文件");
        QMenu *editMenu = bar->addMenu("编辑");
        //添加菜单项
        QAction * newAction=fileMenu->addAction("新建");
        //添加分割线
        fileMenu->addSeparator();
        QAction * openAction=fileMenu->addAction("打开");
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    工具栏

    1. 创建工具栏(工具栏可以有多个)
    2. 工具栏添加到窗口
    3. 设置停靠的位置(上下左右)
    4. 设置浮动效果(就是可以停留在页面的任意位置,如果移动被禁用,则自动失效)
    5. 设置移动(传递的是bool值,为false则不可被拖拽)
    6. 工具条可以添加小控件如QPushButton之类的,也可以添加菜单项
    7. 为了美观,可以为菜单项设置分割线,同样是调用addSeparator()方法
    //工具栏 可以有多个
        QToolBar *toolBar = new QToolBar(this);
        //addToolBar(toolBar);
        //将工具栏放在左侧
        addToolBar(Qt::LeftToolBarArea,toolBar);
        //工具栏在不特殊设置时,是可以上下左右停靠的
        //只允许上下停靠
        toolBar->setAllowedAreas(Qt::TopToolBarArea|Qt::BottomToolBarArea);
        //设置工具栏是否可以浮动 就是停留在界面的任意位置
        toolBar->setFloatable(false);//设置后,工具栏可以拖拽,但鼠标一离开,就立刻停靠在初始位置(左右,或上下)
        toolBar->setMovable(false);//设置后,不能再拖拽工具栏,此时设置的停靠效果也消失
        //工具栏中添加小控件
        QPushButton *btn = new QPushButton("按钮",this);
        toolBar->addWidget(btn);
        //工具栏添加菜单项
        toolBar->addAction(newAction);
        toolBar->addSeparator();
        toolBar->addAction(openAction);
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18

    状态栏

    1. 创建状态栏(状态栏也只能有一个)
    2. 将状态栏放入窗口(不设置也会生效,可能因为版本,具体可以自己实验)
    3. 设置标签(可以有多个)
    4. 将标签放入状态栏,可以选择从左往右,也可以从右往左
     //状态栏 只有一个
        QStatusBar *status = statusBar();
        //将菜单栏放入窗口(这个好像可有可无,我的qt版本是5.9.0,可以试一下,教学视频是有这个的)
        //setStatusBar(status);
    
        //放入标签
        QLabel *label = new QLabel("左侧信息",this);
        //将标签 放入到 状态栏 (从左往右)
        status->addWidget(label);
        QLabel *label2 = new QLabel("右侧信息",this);
        //将标签 放入到 状态栏 (从右往左)
        status->addPermanentWidget(label2);
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    铆接部件 浮动窗口

    1. 可以有多个
    2. 可以拖拽和停靠
    3. 可以设置停靠范围
    //铆接部件 浮动窗口 可以有多个
        QDockWidget *dock = new QDockWidget("铆接组件",this);
        //添加铆接组件到窗口,前面的参数是默认停靠区域,后面是我们要添加的组件
        addDockWidget(Qt::BottomDockWidgetArea,dock);
        //为铆接组件设置停靠范围,和设置工具栏的停靠范围使用的方法是一样的,只是参数发生了变化
        dock->setAllowedAreas(Qt::LeftDockWidgetArea|Qt::RightDockWidgetArea);
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    核心部件

    1. 很多部件都可以是核心部件
    2. 其余部件围绕核心部件摆放
    3. 核心部件只能有一个
     //核心部件 很多组件都可以设置为核心组件,一旦设置核心组件,其余组件都是围绕其摆放的
        //核心组件只有一个
        QTextEdit *edit = new QTextEdit(this);
        //将组件设置为核心组件
        setCentralWidget(edit);
    
    • 1
    • 2
    • 3
    • 4
    • 5

    资源文件

    1. 将资源导入到项目
      在这里插入图片描述
    2. 添加资源文件文件
      请添加图片描述
    3. 在资源文件中添加资源
      需要先添加前缀,以防项目中资源多繁杂不好找

    在这里插入图片描述
    添加具体资源到资源文件
    请添加图片描述
    记得在添加完后要保存 快捷键为 Ctrl + S
    此时添加成功的标志时res.qrc文件左侧会有个>符号,可以展开
    在这里插入图片描述

    1. 简单使用
    #include "mainwindow.h"
    #include "ui_mainwindow.h"
    
    MainWindow::MainWindow(QWidget *parent) :
        QMainWindow(parent),
        ui(new Ui::MainWindow)
    {
        ui->setupUi(this);
        //在新建的菜单项上显示图片 全局路径的使用文件是本机的,不建议使用
    //    ui->actionNew->setIcon(QIcon("E:/icon/icon_awty71earc7/index.png"));
        //资源文件的使用方式: " : +前缀名 + 文件名"
         ui->actionNew->setIcon(QIcon(":/image/page.png"));
         ui->actionopen->setIcon(QIcon(":/image/logs.png"));
    }
    
    MainWindow::~MainWindow()
    {
        delete ui;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19

    效果图:
    请添加图片描述

    对话框

    对话框分类

    • 模态对话框
      在启用模态对话框时,不可以对其他界面进行操作
      下图就是启用了模态对话框,其中02test3是模态对话框,而MainWindow是其他界面,此时其他界面是不允许操作,只有模态对话框的界面是允许操作的

    在这里插入图片描述

     //模态对话框   不可以对其他窗口进行操作
           QDialog dlg;
           //通过exec()去阻塞
           dlg.exec();
    
    • 1
    • 2
    • 3
    • 4

    指定父窗口的QDialog变化
    在这里插入图片描述
    此时会提示对话框过小

    setGeometry: Unable to set geometry 100x30+910+505 on QWidgetWindow/‘QDialogClassWindow’. Resulting geometry: 120x30+910+505 (frame: 8, 31, 8, 8, custom margin: 0, 0, 0, 0, minimum size: 0x0, maximum size: 16777215x16777215).
    setGeometry: Unable to set geometry 100x30+910+505 on QWidgetWindow/‘QDialogClassWindow’. Resulting geometry: 120x30+910+505 (frame: 8, 31, 8, 8, custom margin: 0, 0, 0, 0, minimum size: 0x0, maximum size: 16777215x16777215).

    我们需要将对话框的大小进行设置

    • 非模块对话框
      在启用非模态对话框时,不能创建在栈区,要不然由于没有方法进行阻塞,会在函数结束后进行释放,不符合我们的需求,此时需要通过new方法去将内存开辟到堆区
      同样需要设置窗口的大小,避免报错,再通过show()去展示
    //非模态对话框,可以对其他窗口进行操作 由于没有exec()进行阻塞,这个对话框需要创建在堆区才不会一闪而过
           QDialog *dlg2=new QDialog(this);
           dlg2->resize(150,80);
           dlg2->show();
    
    • 1
    • 2
    • 3
    • 4

    在这里插入图片描述
    从上图不难看出其他界面再启用非模态对话框时,还是可以进行操作的

    由于我们的对话框是挂在父窗口上,父窗口不关闭,就不会释放掉对话框所占的空间,可能会造成内存奔溃,此时我们需要添加

    dlg2->setAttribute(Qt::WA_DeleteOnClose);//55号属性
    
    • 1

    让对话框可以在关闭对话框时,释放掉对话框所占的内存空间

    标准对话框

    所谓标准对话框,是Qt内置的一系列对话框,用于简化开发。
    事实上,有很多对话框都是通用的,比如打开文件、设置颜色、打印设置等。这些对话框在所有程序中几乎相同,所以没必要所有程序都自己实现对话框。

    Qt内置的对话框大致分为以下几类:
    • QColorDialog: 选择颜色
    • QFileDialog : 选择文件或目录
    • QFontDialog: 选择字体
    • QInputDialog:允许用户输入一个值,并将其返回
    • QMessageBox: 模态对话框,用于显示信息、询问问题等
    • QPageSetupDialog:为打印机提供纸张相关的选项
    • QPrintPreviewDialog:打印预览
    • QProgressDialog: 显示操作过程
    QMessageBox

    错误提示对话框

    QMessageBox::critical(this,"错误","critcal");
    
    • 1

    在这里插入图片描述
    信息对话框

     QMessageBox::information(this,"信息","information");
    
    • 1

    在这里插入图片描述
    提问对话框

    //提问对话框
           //参数1 父窗口 参数2 窗口标题 参数3 提示信息 参数4 按键类型(默认按键类型是yes|no,可以进行修改)
           QMessageBox::question(this,"提问","question?");
    
    • 1
    • 2
    • 3

    在这里插入图片描述

           //参数1 父窗口 参数2 窗口标题 参数3 提示信息 
           //参数4 按键类型(默认按键类型是yes|no,可以进行修改) 参数5 关联回车按键(默认选中)
          QMessageBox::question(this,"提问","question?",QMessageBox::Save|QMessageBox::Cancel,QMessageBox::Cancel);
    
    • 1
    • 2
    • 3

    在这里插入图片描述
    怎么控制提问对话框的按钮?

    if(QMessageBox::Save==
                   QMessageBox::question(this,"提问","question?",
                                         QMessageBox::Save|QMessageBox::Cancel,
                                         QMessageBox::Cancel))
           {
               qDebug()<<"点击的是Save";
    
           }else{
               qDebug()<<"点击的是Cancel";
           }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    警告对话框

     QMessageBox::warning(this,"警告","warning!!!");
    
    • 1

    在这里插入图片描述

    其它常用对话框
    QFileDialog(文件对话框)
     //打开文件 参数1 父窗口 参数2 标题 参数3 目标路径 参数4 过滤文件
           QFileDialog::getOpenFileName(this,"打开文件",
                                        "C:\\Users\\Administrator\\Documents\\WeChat Files\\wxid_nqdxbnclvfzd22\\FileStorage\\File\\2022-10"
                                        ,"(*.txt)");
    
    • 1
    • 2
    • 3
    • 4

    请添加图片描述
    可以用一个QString来接收打开的文件名,此时拿到的文件名是绝对路径

    QColorDialog (颜色对话框)
     //颜色对话框
           QColor color=QColorDialog::getColor(QColor(255,0,0));
           qDebug()<<color.red()<<color.green()<<color.blue();
    
    
    • 1
    • 2
    • 3
    • 4

    请添加图片描述

    QFontDialog(字体对话框)
    //字体对话框
           bool ok;
           //参数 一个bool值,QFont("字体",字号)
           QFont font =QFontDialog::getFont(&ok,QFont("华文彩云",36));//通过返回值,可以拿到选中的字体是什么,多大
           qDebug()<<"字体"<<font.family()
                  <<"字号"<<font.pointSize()
                 <<"是否倾斜"<<font.italic()
                <<"是否是粗体"<<font.bold();
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    由于我的电脑没有华文彩云这种字号,所以默认选字体的第一种
    请添加图片描述

    登录界面小试

    QT本身是有很多布局的
    在这里插入图片描述
    大致就是水平,竖直,网格,形状布局
    水平就是方向上是水平的,竖直与之相反
    网格和形状布局差不多

    如果我们要做登录界面,直接使用布局会有很多红框影响布局效果
    此时我们可以用一个更小的容器去包裹一些布局,Widget作为容器是非常好的选择
    其可以支持水平,竖直和栅格布局
    我们可以将用户名和密码以及他们的输入框放入同一个Widget中,使用栅格布局,使其摆放有规律,
    此时页面不是很完美,Widget容器过大,且用户名和密码之间的间距过小

    关于Widget容器过大,可以把它的水平策略更改为fixed,使其在水平方向上包裹容器中的容件,位置是

    在这里插入图片描述
    如果各个空间之间的间距过小,可以通过添加组件Spacers(弹簧)去改变,弹簧分水平和竖直方向
    在这里插入图片描述

    此时的布局界面是可以随意改变的,如果我们不想界面被改变,可以设置其固定的最大和最小大小,使其保持一致
    在这里插入图片描述
    现在看一下具体效果
    在这里插入图片描述
    根据正常逻辑,我们的密码是不应该明文显示的,此时只要改变echoMode属性

    echoMode属性简介:

    • NoEcho 是linux下密码的策略 就是用户看不到输入,输入框没有任何的显示
    • Password 直接就是用小圆点替代输入的字符
    • PasswordEchoOnEdit 在输入时是明文显示,如果鼠标的聚焦不在输入框,则变成小圆点替代输入的字符

    具体逻辑还没写

    常用控件

    按钮组件 (直接点进去看文章,不做详述)

    QListWidget

    1. QListWidget 的每个项都称为 QListWidgetItem
    2. 通过单个添加QListWidgetItem 可以为其设置对齐状态
    3. 也可以一次性加入多个QListWidgetItem,有默认的对齐状态,无法进行更改
    QListWidgetItem *item1 = new QListWidgetItem("下午吃什么?");
        ui->listWidget->addItem(item1);
        //设置QListWidgetItem的显示 水平居中    
        item1->setTextAlignment(Qt::AlignHCenter);
        //QStringList ====== QList List
        QStringList list;
        list<<"明天你好"<<"声音多渺小"<<"却提醒我"<<"勇敢是什么";
        ui->listWidget->addItems(list);
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    代码中的listWidget是一个QListWidget对象
    代码运行图示:
    在这里插入图片描述

    QTreeWidget

    1. 设置头 作为标题项目
    2. 设置根节点
    3. 设置子节点
    #include "widget.h"
    #include "ui_widget.h"
    #include
    Widget::Widget(QWidget *parent) :
        QWidget(parent),
        ui(new Ui::Widget)
    {
        ui->setupUi(this);
        //设置头
        ui->treeWidget->setHeaderLabels(QStringList()<<"英雄"<<"英雄介绍");
        //TreeWidget每个项目都称为QTreeWidgetItem
        //添加根节点
        QTreeWidgetItem *item1 = new QTreeWidgetItem(QStringList()<<"辅助");
        QTreeWidgetItem *item2 = new QTreeWidgetItem(QStringList()<<"打野");
        QTreeWidgetItem *item3 = new QTreeWidgetItem(QStringList()<<"中单");
    
        ui->treeWidget->addTopLevelItem(item1);
        ui->treeWidget->addTopLevelItem(item2);
        ui->treeWidget->addTopLevelItem(item3);
        //添加子节点
        QStringList l11;
        QStringList l12;
        QStringList l13;
        l11<<"派克"<<"刺客,会打钱";
        l12<<"乌鸦"<<"法坦,巨能吸";
        l13<<"泰坦"<<"坦克,直接一抗五";
        QTreeWidgetItem *l1 = new QTreeWidgetItem(l11);
        QTreeWidgetItem *l2 = new QTreeWidgetItem(l12);
        QTreeWidgetItem *l3 = new QTreeWidgetItem(l13);
        item1->addChild(l1);
        item1->addChild(l2);
        item1->addChild(l3);
    }
    
    Widget::~Widget()
    {
        delete ui;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38

    在这里插入图片描述

    QTabelWidget

    1. 设置列
    2. 设置水平表头
    3. 设置行数
    4. 设置具体内容
    #include "widget.h"
    #include "ui_widget.h"
    
    Widget::Widget(QWidget *parent) :
        QWidget(parent),
        ui(new Ui::Widget)
    {
        ui->setupUi(this);
        //tabelWidget
        //设置列
        //设置列数
        ui->tableWidget->setColumnCount(3);
    
        //设置水平表头
        ui->tableWidget->setHorizontalHeaderLabels(QStringList()<<"姓名"<<"性别"<<"年龄");
        //设置行数
        ui->tableWidget->setRowCount(5);
        //设置具体内容
        QList<QString> nameList;
        nameList<<"张三"<<"李四"<<"王五"<<"赵六"<<"钱七";
        QStringList sexList;
        sexList<<"男"<<"女"<<"男"<<"女"<<"男";
        for(int i=0;i<5;i++){
            int col = 0;
            ui->tableWidget->setItem(i,col++,new QTableWidgetItem(nameList[i]));
            ui->tableWidget->setItem(i,col++,new QTableWidgetItem(sexList.at(i)));
            ui->tableWidget->setItem(i,col++,new QTableWidgetItem(QString::number(18+i)));
        }
    
    }
    
    Widget::~Widget()
    {
        delete ui;
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36

    在这里插入图片描述

  • 相关阅读:
    Vim基础
    深入理解Java并发锁
    redux的实现(包含combineRerucers、applyMiddleware、react-redux的connect)
    CVPR2022 | 无需对齐就能胜任大运动超分的内存增强非局部注意方法
    分享5款日常生活中会用到的小工具
    python 基础知识点(蓝桥杯python科目个人复习计划56)
    TorchScript C++ 自定义运算符 cpu&cuda
    删除字符串字符,使输出结果不包含回文串
    组合学笔记(六)局部有限偏序集的关联代数,Möbius反演公式
    保留网络[02/3]:大型语言模型转换器的继任者”
  • 原文地址:https://blog.csdn.net/qq_46066548/article/details/127371231