QT学习之QMainWindow

QWidget为空窗口,QMainWindow是一个为用户提供主窗口程序的类,包含一个菜单栏(menu bar),多个工具栏(tool bars),多个锚接部件(dock widgets),一个状态栏(status bar)及一个中心部件(central widget),是许多应用程序的基础。

菜单栏

#include "mainwindow.h"
#include <QMenuBar>

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
{
    this->setFixedSize(600,400);

    //创建菜单栏
    QMenuBar * menubar =  menuBar();//menuBar的返回值是QMenuBar *,需要创建一个来接收
    //把菜单栏放在窗口中
    setMenuBar(menubar);
    //此时仍旧不显示,因为是空的菜单栏,什么也没有

    //创建菜单  要包含头文件
    menubar->addMenu("文件");
}

MainWindow::~MainWindow() {}

右键addMenu上下文相关帮助查询帮助文档,
在这里插入图片描述
使用的这个函数,返回值是QMenu,
所以QMenu * fileName = menubar->addMenu("文件");

//创建菜单栏,菜单栏最多只有一个
    QMenuBar * menubar =  menuBar();//menuBar的返回值是QMenuBar *,需要创建一个来接收
    //把菜单栏放在窗口中
    setMenuBar(menubar);
    //此时仍旧不显示,因为是空的菜单栏,什么也没有

    //创建菜单  要包含头文件
    QMenu * fileMenu = menubar->addMenu("文件");
    QMenu * editMenu = menubar->addMenu("编辑");

    //创建菜单项
    fileMenu->addAction("新建");
    //在菜单项之间添加分隔符
    fileMenu->addSeparator();
    fileMenu->addAction("打开");

工具栏

工具栏的区域
在这里插入图片描述

  //工具栏 可以有多个
    QToolBar *toolbar = new QToolBar(this);
    addToolBar(Qt::LeftToolBarArea,toolbar);
    //设置只允许左右停靠
    toolbar->setAllowedAreas(Qt::LeftToolBarArea | Qt::RightToolBarArea);
    //设置不允许浮动
    toolbar->setFloatable(false);

    //工具栏内容
    toolbar->addAction("新建");
    toolbar->addSeparator();
    toolbar->addAction("打开");

    //工具栏中添加控件,按钮
    QPushButton * button = new QPushButton("工具栏中的按钮",this);
    toolbar->addWidget(button);

状态栏

    //创建状态栏,最多也只能有一个
    QStatusBar * statusbar = statusBar();
    //设置到窗口中
    setStatusBar(statusbar);
    //放标签控件
    QLabel * lab1 = new QLabel("提示信息",this);
    statusbar->addWidget(lab1);

    QLabel * lab2 = new QLabel("右侧提示信息",this);
    statusbar->addPermanentWidget(lab2);

铆接部件和中心部件

    //铆接部件 (浮动窗口) 可以有多个
    QDockWidget * dockwidget = new QDockWidget("浮动",this);
    this->addDockWidget(Qt::LeftDockWidgetArea,dockwidget);
    //设置后期停靠区域,只允许停靠在左右区域
    dockwidget->setAllowedAreas(Qt::LeftDockWidgetArea | Qt::RightDockWidgetArea);

    //设置中心部件  只能有一个
    QTextEdit * textedit = new QTextEdit("文本编辑器",this);
    this->setCentralWidget(textedit);

运行后生成的窗口为
在这里插入图片描述
只能添加一个的函数是set开头,能添加多个的函数是add开头

资源文件添加

尝试使用ui
在这里插入图片描述
双击ui文件,进行拖拽控件编辑
在这里插入图片描述

在这里插入图片描述
菜单栏中的菜单项不能选择中文
因为属性这里
在这里插入图片描述
程序中给变量起名字不能出现action+中文的格式,可以在text中修改为中文
进行资源文件添加,给菜单加个图片
在项目同目录下添加一个图片文件,Image文件
在这里插入图片描述
然后右键添加新文件-QT-QT Resourse File-选择-起个名字,不要有中文,然后在资源文件中添加前缀,再添加文件,打开项目同目录下的Image选择相应的图片打开,编译后就会显示
在这里插入图片描述
复制路径
在这里插入图片描述

#include "mainwindow.h"
#include "ui_mainwindow.h"

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

    //使用添加QT资源  “:+前缀名 + 文件名”
    ui->actionnew->setIcon(QIcon(":/new/prefix1/Image/Zombatar_1.jpg"));
}

MainWindow::~MainWindow()
{
    delete ui;
}

运行后在这里插入图片描述
第一次添加资源文件时不清楚怎么回事报错:-1: error: [Makefile.Debug:758: debug/qrc_res.o] Error 1,怎么都找不到原因,后来把原来的资源文件删除后,重新添加了资源文件后可以成功。

对话框

标准对话框
QcolorDialog:选择颜色:
QFileDialog:选择文件或者目录;
QFontDialog:选择字体;
QInputDialoga 允许用户输入一个值,并将其值返回;
QMessageBox 模态对话框,用于显示信息、询间问题等;以
QPageSetupDialog:为打印机提供纸张相关的选项;
QPrintDialog:打印机配置;v
QPxintPrexvenDialog:打印预览;
QProgressDialog:显示操作过程。。

模态和非模态对话框创建

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

    //点击新建按钮弹出对话框
    connect(ui->actionNew,&QAction::triggered,
            this,[=](){
        //对话框分为模态和非模态,模态对话框,弹出后不可以对其他窗口进行操作
        QDialog * dlg1 = new QDialog(this);
        dlg1->resize(200,100);
        dlg1->exec();//main函数中也有exec,相当于阻塞的功能
    });
    connect(ui->actionOpen,&QAction::triggered,
            this,[=](){
        //非模态对话框,弹出后可以对其他窗口进行操作
        QDialog * dlg2 = new QDialog(this);
        //假如是 QDialog  dlg2(this);,变量在栈区,执行完show后就会被释放掉,结果就是会闪一下
        dlg2->resize(200,100);
        dlg2->show();
        //上诉代码有个问题,假如用户一直点打开按钮又关闭,
        //会导致 QDialog * dlg2一直在堆区创建,而又没有delete
        //有可能造成内存泄漏,可以通过下面代码进行处理
        dlg2->setAttribute(Qt::WA_DeleteOnClose);

    });
}

消息对话框

//消息对话框
    //错误
    connect(ui->actionmessage,&QAction::triggered,this,
            [=](){
        // QMessageBox * messageBox = new QMessageBox;
        // messageBox->critical(this,"错误","错误对话框");
        //QMessageBox中的critical这些函数是静态成员函数,也可以不创建对象直接使用
        QMessageBox::critical(this,"错误","错误对话框");
    });
    
    //信息
    connect(ui->actioninfo,&QAction::triggered,this,
            [=](){
                QMessageBox::information(this,"信息","信息对话框内容");
    });
    
    //问题
    connect(ui->actionquestion,&QAction::triggered,this,
            [=](){
                if( QMessageBox::question(this,"问题","问题对话框内容",QMessageBox::Ok | QMessageBox::Reset) ==  QMessageBox::Ok)
        //question第四个参数是问题中的按钮,第五个参数是默认关联回车的按键,返回值是QMessageBox::StandardButton ,是第四个参数
                {
            qDebug()<<"用户按的是ok";
        }
        else
                {qDebug()<<"用户按的是Reset";}
    });
    
    //警告
    connect(ui->actionwarning,&QAction::triggered,this,
            [=](){
                QMessageBox::warning(this,"警告","警告对话框内容");
    });

其他对话框,颜色,文件,字体

//颜色对话框
    connect(ui->actioncolor,&QAction::triggered,this,
            [=](){
                QColor color = QColorDialog::getColor(QColor(255,0,0));
        qDebug()<<"r="<<color.red()<<"g="<<color.green()<<"b="<<color.blue();
    });

    //文件对话框
    connect(ui->actionfile,&QAction::triggered,this,
            [=](){
            QString str= QFileDialog::getOpenFileName(this,"打开文件","D:\桌面","*.doc");
        //参数描述:父类,标题,默认打开路径,过滤文件类型
        //返回值是选中文件的路径
            qDebug()<<str;
    });

    //字体对话框
    connect(ui->actionfont,&QAction::triggered,this,
            [=](){
                bool ok;
                QFont font =  QFontDialog::getFont(&ok,QFont("华文彩云",30),this,"字体对话框");
                qDebug()<<"字体:"<<font.family()<<"字号:"<<font.pointSize()
                         <<"是否加粗:"<<font.bold()
                         <<"是否倾斜:"<<font.italic();
                //这样打印出来的字体是带双引号的,而其他的没带,因为字体返回值是QString,要想不加双引号可以这么做
                qDebug()<<"字体:"<<font.family().toUtf8().data()<<"字号:"<<font.pointSize()
                         <<"是否加粗:"<<font.bold()
                         <<"是否倾斜:"<<font.italic();
    });

登录窗口布局

进入ui界面编辑
登录窗口,类似于qq那样的
拖拽两个标签Label,写“用户名”和“密码”,再拖拽两个Line Edit,登录和退出按钮为Push Button,现在是这样的:
在这里插入图片描述
为了对齐
先拖出一个Widget,把用户名和一个Line Edit放进去,点击上面的水平布局
在这里插入图片描述
同理再把密码弄一个水平布局,按钮弄一个水平布局,再点最大的窗口进行垂直布局
在这里插入图片描述
结果是这样的在这里插入图片描述
按钮可能有点长,可以加个Horizontal Spacer放在按钮的两侧,顶住大窗口的两边
在这里插入图片描述
按钮中间也可以加个弹簧,但这样窗口放大,按钮间距也会变大,窗口缩小,按钮间距也会缩小,因此把中间弹簧的属性改为固定值,但用户名和密码的白框不齐,可以加个空格补齐,也可以通过栅格布局
先选中最大的窗口,右键布局,打破布局(分拆布局),然后新拉一个Widget,把用户名和密码加上那两个白框放到Widget中,点击栅格布局,仍有问题,上面两行和两个按钮距离太大,可以选中对应的小窗口右下角的sizePolicy里的垂直策略,选FIxed,最终调整后效果为:
在这里插入图片描述
窗口和弹簧之间默认是九个像素的间隙,可以进行修改:
在这里插入图片描述

常用控件

按钮组

Tool Button,可以添加一些图片在按钮上
在这里插入图片描述
1处是可以选择一些图片,2处可以选择图片和按钮名字的位置关系,后面的autoRaise选中可以让按钮变透明
Radio Button是单选按钮,多个单选按钮可以通过放到Group Box中进行分组,布局之后默认是两个都没选,若想默认选男,需要在代码上进行操作
在这里插入图片描述
在这里插入图片描述
Check Box多选按钮
多选的信号有继承的也有自己的信号函数
在这里插入图片描述
可以看到选中为2,不选中为0,
在这里插入图片描述
选中这就可以出现1了,1是半选

ItemWidgets (Item—Based)

基于项目的

List Widget

//利用List Widget写诗
    //方法一
    QListWidgetItem * item = new QListWidgetItem("锄禾日当午");//一行
    //将写的诗放到控件中
    ui->listWidget->addItem(item);
    //设置诗句的位置
    item->setTextAlignment(0x0004);

    //方法二
    QStringList list;
    list<<"锄禾日当午"<<"汗滴禾下土"<<"谁知盘中餐"<<"粒粒皆辛苦";
    ui->listWidget->addItems(list);//没法居中

在这里插入图片描述

Tree Widget

树控件

 //  Tree Widget树控件的使用
    //设置水平头
    ui->treeWidget->setHeaderLabels(QStringList()<<"英雄"<<"英雄简介");
    //创建了一个匿名对象

    QTreeWidgetItem * item1 = new QTreeWidgetItem(QStringList()<<"坦克");
    //添加顶层节点
    ui->treeWidget->addTopLevelItem(item1);

    QTreeWidgetItem * item2 = new QTreeWidgetItem(QStringList()<<"射手");
    ui->treeWidget->addTopLevelItem(item2);

    QTreeWidgetItem * item3 = new QTreeWidgetItem(QStringList()<<"法师");
    ui->treeWidget->addTopLevelItem(item3);

    //追加子节点
    QStringList hero1;
    hero1 <<"廉颇"<<"三个技能都是霸体";
    QTreeWidgetItem * item1_son1 = new QTreeWidgetItem(hero1);
    item1->addChild(item1_son1);

在这里插入图片描述

Table Widget

   //Table Widget
    //先设置列数
    ui->tableWidget->setColumnCount(3);

    //设置水平表头
    ui->tableWidget->setHorizontalHeaderLabels(
        QStringList()<<"姓名"<<"性别"<<"年龄");
    //设置行数
    ui->tableWidget->setRowCount(3);
    //设置正文
    //ui->tableWidget->setItem(0,0,new QTableWidgetItem("李四"));
    //循环添加信息

    QStringList nameList;
    nameList<<"李四"<<"张三"<<"王五";

    QList<QString> sexList;//和上面的是一个意思
    sexList<<"男"<<"女"<<"男";

    for(int i = 0;i<3;i++)
    {
        int col = 0;//列
        ui->tableWidget->setItem(i,col++,new QTableWidgetItem(nameList[i]));
        ui->tableWidget->setItem(i,col++,new QTableWidgetItem(sexList.at(i)));
        //年龄是int,转为QString
        ui->tableWidget->setItem(i,col++,new QTableWidgetItem(QString::number(i+18)));
    }

在这里插入图片描述

其他

Scrool Area滚动

Tool Box,类似QQ的家人,朋友列表

Tab Widget,类似网页上面不同网页的切换

Stacked Widget 类似QT Creater,左侧区域,欢迎、编辑等等按钮切换不同区域,需要配合按钮使用


    connect(ui->PushButton_Scrool,&QPushButton::clicked,this,[=](){
        ui->stackedWidget->setCurrentIndex(0);
    });
    connect(ui->PushButton_Tool,&QPushButton::clicked,this,[=](){
        ui->stackedWidget->setCurrentIndex(1);
    });
    connect(ui->PushButton_Tab,&QPushButton::clicked,this,[=](){
        ui->stackedWidget->setCurrentIndex(2);
    });

在这里插入图片描述

Combo Box 下拉框

    //下拉框
    ui->comboBox->addItems(QStringList()<<""<<"张三"<<"李四"<<"王五");
    //点击李四按钮,会选中在下拉框选中李四
    connect(ui->Button_lisi,&QPushButton::clicked,this,[=](){
        //法一
        //ui->comboBox->setCurrentIndex(2);//索引号类似数组,0 1 2 ,2号
        //法二
        ui->comboBox->setCurrentText("李四");
    });

在这里插入图片描述

Lable,标签也可以放图片和动图

    //Lable显示图片
    ui->label_photo->setPixmap(QPixmap(":/new/prefix1/Image/onep.ico"));
    //显示动图,包含#include<QMovie>头文件
    QMovie * movie = new QMovie(":/new/prefix1/Image/movie.gif");
    ui->label_movie->setMovie(movie);
    //播放
    movie->start();

在这里插入图片描述

  • 13
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值