Qt编程_day03

界面控件

1、QMainWindow

包括了一个菜单栏、多个工具栏、一个状态栏、多个停靠部件(锚接部件)、一个核心部件

菜单栏

	    //菜单栏,获取当前窗口的菜单栏,没有的话会自动创建一个
		QMenuBar *mb = this->menuBar();

工具栏

		QToolBar *toolBar = this->addToolBar("");
		//设置工具栏停靠范围		   toolBar->setAllowedAreas(Qt::LeftToolBarArea|Qt::RightToolBarArea);
		//设置工具栏不可以浮动
		toolBar->setFloatable(false);
		//设置工具栏不允许拖动
		toolBar->setMovable(false);

状态栏

		//获取窗口的状态栏,没有的话就创建一个
		QStatusBar *sb = this->statusBar();    
		//添加左侧信息
		QLabel *labelLeft = new QLabel("左侧信息",this);
		sb->addWidget(labelLeft);
		//添加右侧信息
		QLabel *labelRight = new QLabel("右侧信息",this);
		sb->addPermanentWidget(labelRight);

停靠部件,可以有多个

		QDockWidget *dockWidget = new QDockWidget("停靠部件",this);
		//默认情况下没有核心部件作为参照物,停靠部件会占完窗口
		this->addDockWidget(Qt::BottomDockWidgetArea,dockWidget);

核心部件,只有一个

		//添加核心部件
		QTextEdit *textEdit = new QTextEdit(this);
		this->setCentralWidget(textEdit);

2、ui文件的使用

创建项目的时候保留UI
setupUI函数,就是关联UI文件的代码到程序
原理就是qt将ui文件转化成了C++的代码
要使用ui里边的对象
就直接使用 ui-> 对象名  来获取窗口对象指针

在这里插入图片描述
后续我们可以使用ui快速构建我们的界面。
如何使用ui快速构建界面?
第一步:双击ui文件
在这里插入图片描述会出现如下界面
在这里插入图片描述我们的主要工作就是将左侧的部件拖到右侧,按照自己的任务去构建界面
第二步:在操作界面点击在这里输入,建立菜单栏,并建立菜单项
在这里插入图片描述在这里插入图片描述在这里插入图片描述

第三步:建立工具栏
在这里插入图片描述设置工具栏只能左右停靠,且不可浮动
在这里插入图片描述
第四步:设置核心部件
在这里插入图片描述第五步:设置停靠部件
在这里插入图片描述

3、资源文件的使用

1 使用绝对路径的方式使用资源
要将资源也打包好发送给人家才可以看到
2 使用qt的资源文件
项目添加文件 qt - > qt resource file -> 文件名 res
添加前缀 / -> 添加文件 (文件只能从项目目录下面去引进)

	使用资源文件的方式
		冒号 :  +  前缀 /  + qrc文件里边的文件名
		
		":/Image/Luffy.png"

示例:

//使用图片资源
    //1、使用绝对路径
    ui->actionNew->setIcon(QIcon("C:\\Users\\Lenovo\\Desktop\\image\\dog.PNG"));

    //2、使用资源文件
    //使用资源文件的格式;
    //冒号:+ 前缀 / +目录文件名
    ui->actionOpen->setIcon(QIcon(":/image/dog.PNG"));

在这里插入图片描述
创建资源文件的步骤

在这里插入图片描述在这里插入图片描述在这里插入图片描述

接下来点击下一步,点击完成即可
创建完成后,我们会看到如下界面
在这里插入图片描述
若我们不小心关闭这个文件的话,可以右击res.qrc这个文件,然后点击Open in Editor即可。
在这里插入图片描述

在打开的这个文件下方,点击添加->添加前缀/
在这里插入图片描述

接下来再点击添加->添加文件(我们需要提前把要使用的资源文件放到当前代码的目录下)->选中要添加的文件即可,最后记得保存。
在这里插入图片描述
至此,我们的资源文件创建完毕。

4、对话框

没有最大化、最小化按钮的窗口
模态对话框 ,就是对话框还没有关闭前不能操作同一个进程的其他窗口
非模态对话框,就是对话框没有关闭前也能操作同一个进程的其他窗

创建模态
QDialog::exec() 函数 ,是一个阻塞的消息循环函数

创建非模态对话框
使用show 函数 来直接显示窗口就可以 ,非阻塞的情况下要使用new的方式来创建对话框对象
内存泄漏问题,模态对话框关闭后并没有马上释放
通过设置窗口的属性来让其关闭后自动释放
dlg->setAttribute(Qt::WA_DeleteOnClose);

示例:

	connect(ui->actionModel,&QAction::triggered,[=](){
       //创建一个模态对话框
        QDialog dlg(this);
        dlg.exec();
    });

    connect(ui->action_NoModel,&QAction::triggered,[=](){
        //创建一个非模态对话框
        //因为show是非阻塞函数,所以dlg会很快释放,改用new创建dlg
        QDialog *dlg = new QDialog(this);
        //设置窗口点击后销魂内存
        dlg->setAttribute(Qt::WA_DeleteOnClose);
        dlg->show();
    });

5、系统标准对话框

QMessageBox 用来提示用户某条信息,分为以下几个级别
info
warning
critical
question
都挺可以通过 QMessageBox::函数名的方式 来调用,产生模态的对话框
但是question 特殊 ,可以指定对话框的按钮,通过返回值来获取用户点击了哪个按钮

			if(QMessageBox::Ok==
					QMessageBox::question(this,"问你个事","你有对象吗?",
								  QMessageBox::Ok|QMessageBox::Cancel))
			{
				qDebug()<<"点击了Ok";
			}			

文件对话框
使用QFileDialog 来打开一个文件对话框
常用的函数是getOpenFileName来选择单一某文件
可以指定默认路径,
还可以指定文件过滤器,格式: 类型名称 ( *.类型后缀 …) ;; 类型名称2 …
通过返回值来获取用户选取了哪个文件

		 QString fileName = QFileDialog::getOpenFileName(this,"打开一个文件",
                                 "G:\\C7_Qt\\day02\\03_resources\\Image",
                                 "PNG (*.png) ;; JPG (*.jpg) ;; GIF (*.gif) ;; all (*.*)");

创建对话框的步骤:
使用ui设计,在工具栏加上info,warning,critical,question
dcs
以info为例,点击下方的actionInfo,再点击转到槽,点击triggered(),就会在mainwindow.h和mainwindow.cpp生成对应的槽函数:void on_actionInfo_triggered();然后自己写函数实现即可

void MainWindow::on_actionInfo_triggered()
{
    QMessageBox::information(this,"通知","information");
}

实现效果如下图所示。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述warning,critical,question的实现代码如下。

void MainWindow::on_actionCritical_triggered()
{
    QMessageBox::critical(this,"危险","ctrical");
}

void MainWindow::on_actionWarning_triggered()
{
    QMessageBox::warning(this,"警告","warning");
}
void MainWindow::on_actionQuestion_triggered()
{
    if(QMessageBox::Ok==QMessageBox::question(this,"提问","你有对象吗",
                          QMessageBox::Ok|QMessageBox::Cancel))
    {
        qDebug()<<"他有对象";
    }
    else{
        qDebug()<<"他没有对象";
    }
}

6、布局

两类:静态和动态
静态就是位置和大小不会跟着外部窗口变化而变化。
动态就是位置和大小会跟着外部窗口变化而变化。

常用动态布局
水平、垂直、栅格、表单布局
推荐使用widget的自带的布局功能

使用弹簧来调整布局的位置,居中
栅格布局可以将空间分为几行几列的表格,方便对齐
大小策略:默认情况下动态布局,子窗口的大小会跟着父窗口的大小变化而变化,调整水平或者垂直策略,变成固定
调整子窗口和父窗口之间的间隙,设置父窗口的margin ,调整子窗口之间的间隙就调整spacing

调整窗口的固定大小,就是将窗口的最大值和最小值都设为同一个值

示例:实现一个如下图所示的登录窗口
在这里插入图片描述
第一步:来到设计页面
第二步:将用户名和密码这两个label,注册和登录两个按钮,两个输入窗口放上去。
在这里插入图片描述

第三步:将用户名与其输入框放入窗口widget中;将密码与其输入框放入另一个窗口widget中;将登录与注册放入另一个窗口widget中;然后使这三个窗口都使用水平布局,然后再选中外面最大的一个widget窗口,选择垂直布局。
在这里插入图片描述

第四步:使用弹簧使的输入框部分无论窗口变大变小都居中
在这里插入图片描述第五步:为了让用户名,密码对齐,需要使用栅格布局。首先我们先打破布局,将用户名,密码及其输入框抽离出来,然后在建立一个widget,把二者拖进去,对该widget进行栅格布局,最后在对外面最大的widget进行垂直布局。
在这里插入图片描述运行发现用户名与密码对齐了
在这里插入图片描述但是发现登录与注册离得比较近,可以用弹簧来分隔
在这里插入图片描述
可以发现上图标注点都有空隙存在
点击最外层的widget窗口,在右下的属性框里找到这几个属性,将其赋值为0
在这里插入图片描述第六步:固定窗口的大小,不可缩放
点击最外层widget窗口,设置如下属性
在这里插入图片描述

7、listWidget

使用方式

#include "widget.h"
#include "ui_widget.h"

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

    //QListWidgetItem *item = new QListWidgetItem("窗前明月光");
    //ui->listWidget->addItem(item);
    QStringList list;
    list <<"床前明月光" <<"疑是地上霜"<<"举头望明月"<<"低头思故乡";
    ui->listWidget->addItems(list);
}

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

效果图
在这里插入图片描述

8、treeWidget

使用方式
1. 设置标题,会根据setHeaderLabels 里边的成员数自己生成有多少列
2. 添加根节点 treeWidget->addTopLevelItem
3. 根节点下边添加子节点 item->addChild

#include "widget.h"
#include "ui_widget.h"

Widget::Widget(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::Widget)
{
    ui->setupUi(this);
    //设置标题
    QStringList list;
    ui->treeWidget->setHeaderLabels(list<<"英雄"<<"简介");
    //添加根节点
    QTreeWidgetItem *liliangItem = new QTreeWidgetItem(QStringList()<<"力量");
    QTreeWidgetItem *zhiliItem = new QTreeWidgetItem(QStringList()<<"智力");
    QTreeWidgetItem *miejieItem = new QTreeWidgetItem(QStringList()<<"敏捷");
    ui->treeWidget->addTopLevelItem(liliangItem);
    ui->treeWidget->addTopLevelItem(zhiliItem);
    ui->treeWidget->addTopLevelItem(miejieItem);
    //添加子节点
    liliangItem->addChild(new QTreeWidgetItem(QStringList()<<"猪刚列"<<"被攻击后反弹20%的伤害"));
    zhiliItem->addChild(new QTreeWidgetItem(QStringList()<<"小人月"<<"有10%的概率躲闪攻击"));
    miejieItem->addChild(new QTreeWidgetItem(QStringList()<<"小炮"<<"10%的几率触发暴击效果"));
}

9、tableWidget

1 设置行数、列数 setRowCount setColumnCount
2 设置水平的标题 setHorizontalLabels
3 设置表格某行某列的数据 setItem(row,col,item)

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

    //1、设置行数,列数
    ui->tableWidget->setRowCount(5);
    ui->tableWidget->setColumnCount(3);
    //2、设置标题
    ui->tableWidget->setHorizontalHeaderLabels(QStringList()<<"英雄"<<"型别"<<"年龄");
    //3、添加数据
    QStringList heroNames = QStringList()<<"亚瑟"<<"妲己"<<"赵云"<<"随悟空"<<"安其拉";
    QStringList heroGender = QStringList()<<"男"<<"女"<<"男"<<"其他"<<"女";
    QStringList heroAge = QStringList()<<"12"<<"34"<<"22"<<"34"<<"12";
    for(int row = 0; row < 5; ++row){
        ui->tableWidget->setItem(row,0,new QTableWidgetItem(heroNames[row]));
        ui->tableWidget->setItem(row,1,new QTableWidgetItem(heroGender[row]));
        ui->tableWidget->setItem(row,2,new QTableWidgetItem(heroAge[row]));
    }

}

在这里插入图片描述

10、容器

stacked Widget 页面切换需要我们自己去实现,一般使用按钮点击的时候切换
setCurrentIndex 方式切换到第几页,序号从0开始

11、显示控件

label 可以显示静态图 pixmap属性
显示动态图 gif , 要使用 movie
setMovie 函数设置电影
movie->start()来播放动画

Widget::Widget(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::Widget)
{
    ui->setupUi(this);
	//显示动图
    QMovie *moive = new QMovie(":/Images/yanhua.gif",QByteArray(),this);
    ui->label->setMovie(moive);
    moive->start();
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值