QT基础入门——界面布局和常用控件(四)

前言:

所谓 GUI 界面,归根结底,就是一堆组件的叠加。我们创建一个窗口,把按钮放上面,把图标放上面,这样就成了一个界面。在放置时,组件的位置尤其重要。我们必须要指定组件放在哪里,以便窗口能够按照我们需要的方式进行渲染。这就涉及到组件定位的机制。Qt为我们应用程序界面开发提供的一系列的控件,下面我们介绍一下界面布局和最常用一些控件,所有控件的使用方法我们都可以通过帮助文档获取。

目录

一、布局管理器

1.系统提供的布局控件

2.利用widget做布局

 二、常用控件

1.按钮组

2. ListWidget列表容器

 3.QTreeWidget树控件

(1)设置头:

(2)创建根节点:

(3)添加根节点到树控上:

(4)添加子节点:

4.QTableWidget 表格控件

(1)设置列数:

(2)设置水平表头:

(3)设置行数:

(4)设置正文:

5.其他控件 

(1)stackedWidget  栈控件

(2)下拉框   

(3)QLabel 显示图片

(4)QLabel显示动图gif图片

(5)完整代码 


一、布局管理器

1.系统提供的布局控件

这4个为系统给我们提供的布局的控件,但是使用起来不是非常的灵活

2.利用widget做布局

第二种布局方式是利用控件里的widget来做布局,在Containers中

在widget中的控件可以进行水平、垂直、栅格布局等操作,比较灵活。

默认窗口和控件之间有9间隙,可以调整layoutLeftMargine 

利用弹簧进行布局控制:

再布局的同时我们需要灵活运用弹簧的特性让我们的布局更加的美观,下面是一个登陆窗口,利用widget可以搭建出如下登陆界面:

 二、常用控件

1.按钮组

(1)  QpushButton:    常用按钮

(2)  QToolButton:     工具按钮用于显示图片,如图想显示文字

                                   修改风格:   toolButtonstyle ,凸起风格autoRaise

(3)   radioButton:       单选按钮,设置默认 u->rBtnMan->setChecked(true);

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QDebug>MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow)
{ui->setupUi(this);//设置单选按钮   男默认选中ui->rBtnMan->setChecked(true);connect(ui->rBtnWoman,&QRadioButton::clicked,[=](){qDebug() << "选中了女的";});}MainWindow::~MainWindow()
{delete ui;
}

(4)   checkbox:           多选按钮,监听状态,2选中   1当选   0未选中

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QDebug>MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow)
{ui->setupUi(this);//多选按钮  2是选中,0是未选中connect(ui->cBox,&QCheckBox::stateChanged,[=](int state){qDebug() << state;});
}MainWindow::~MainWindow()
{delete ui;
}

2. ListWidget列表容器

  1. QListWidgetItem * item 一行内容
  2. 可以利用addItems一次性添加整个诗内容
  3. 设置居中方式item->setTextAlignment(Qt::AlignHCenter);
  4. ui->listWidget ->addItem ( item )
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QListWidgetItem>
#include <QDebug>MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow)
{ui->setupUi(this);//利用listWidget写诗QListWidgetItem * item = new  QListWidgetItem("锄禾日当午");//将一行诗放到listWidget控件中ui->listWidget->addItem(item);item->setTextAlignment(Qt::AlignHCenter);}MainWindow::~MainWindow()
{delete ui;
}

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QListWidgetItem>
#include <QDebug>MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow)
{ui->setupUi(this);//QList<QString>QStringList list;list << "锄禾日当午" << "旱地和下土" << "谁知盘中餐" << "粒粒皆辛苦";ui->listWidget->addItems(list);}MainWindow::~MainWindow()
{delete ui;
}

 3.QTreeWidget树控件

(1)设置头:

        ui->treeWidget->setHeaderLabels(QStringList()<< "英雄"<< "英雄介绍");

(2)创建根节点:

        QTreeWidgetItem * liItem = new QTreeWidgetItem(QStringList()<< "力量");

(3)添加根节点到树控上:

        ui->treeWidget->addTopLevelItem(liItem);

(4)添加子节点:

        liItem->addChild(l1);

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QDebug>MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow)
{ui->setupUi(this);//treeWidget树控件使用//设置水平头ui->treeWidget->setHeaderLabels(QStringList() << "英雄" << "英雄介绍");QTreeWidgetItem * liItem = new QTreeWidgetItem(QStringList() << "力量");QTreeWidgetItem * minItem = new QTreeWidgetItem(QStringList() << "敏捷");QTreeWidgetItem * zhiItem = new QTreeWidgetItem(QStringList() << "智力");//加载顶层的节点ui->treeWidget->addTopLevelItem(liItem);ui->treeWidget->addTopLevelItem(minItem);ui->treeWidget->addTopLevelItem(zhiItem);//追加子节点QStringList heroL1;heroL1 << "刚被猪" << "前排坦克,能在吸收伤害的同时造成可观的范围输出";QTreeWidgetItem * l1 = new QTreeWidgetItem(heroL1);liItem->addChild(l1);QStringList heroL2;heroL2 << "船长" << "前排坦克,能肉能输出能控场的全能英雄";QTreeWidgetItem * l2 = new QTreeWidgetItem(heroL2);liItem->addChild(l2);QStringList heroM1;heroM1 << "月骑" << "中排物理输出,可以使用分裂利刃攻击多个目标";QTreeWidgetItem * M1 = new QTreeWidgetItem(heroM1);minItem->addChild(M1);QStringList heroM2;heroM2 << "小鱼人" << "前排战士,擅长偷取敌人的属性来增强自身战力";QTreeWidgetItem * M2 = new QTreeWidgetItem(heroM2);minItem->addChild(M2);QStringList heroZ1;heroZ1 << "死灵法师" << "前排法师坦克,魔法抗性较高,拥有治疗技能";QTreeWidgetItem * Z1 = new QTreeWidgetItem(heroZ1);zhiItem->addChild(Z1);QStringList heroZ2;heroZ2 << "巫医" << "后排辅助法师,可以使用奇特的巫术诅咒敌人与治疗队友";QTreeWidgetItem * Z2 = new QTreeWidgetItem(heroZ2);zhiItem->addChild(Z2);
}MainWindow::~MainWindow()
{delete ui;
}

4.QTableWidget 表格控件

(1)设置列数:

        ui->tableWidget->setColumnCount(3);

(2)设置水平表头:

        ui->tableWidget->setHorizontalHeaderLabels(QStringList()<<"姓名"<< "性别"<< "年龄");

(3)设置行数:

        ui->tableWidget->setRowCount(5);

(4)设置正文:

        ui->tableWidget->setItem(0,0, new QTableWidgetItem("亚瑟"));

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QDebug>MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow)
{ui->setupUi(this);//tableWidget表格控件使用//设置列数ui->tableWidget->setColumnCount(3);//设置水平表头ui->tableWidget->setHorizontalHeaderLabels(QStringList()<<"姓名"<< "性别"<< "年龄");//设置行数ui->tableWidget->setRowCount(5);//设置正文
//    ui->tableWidget->setItem(0,0, new QTableWidgetItem("亚瑟"));
//    ui->tableWidget->setItem(0,1, new QTableWidgetItem("男"));
//    ui->tableWidget->setItem(0,2, new QTableWidgetItem("18"));QStringList nameList;nameList << "亚瑟" << "赵云" << "张飞" << "关羽" << "花木兰";QList<QString> sexList;sexList << "男" << "男" << "男" << "男" << "女";//QList<QString>等价于QStringListfor(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)));//int 转QStringui->tableWidget->setItem(i,col++, new QTableWidgetItem(QString::number(i+18)));}}MainWindow::~MainWindow()
{delete ui;
}

5.其他控件 

(1)stackedWidget  栈控件

ui->stackedWidget->setCurrentIndex(1);

#include "widget.h"
#include "ui_widget.h"
#include <QMovie>
Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);//栈控件使用//设置默认定位页面ui->stackedWidget->setCurrentIndex(0);//btn1按钮connect(ui->btn1,&QPushButton::clicked,[=](){ui->stackedWidget->setCurrentIndex(1);});//btn2按钮connect(ui->btn2,&QPushButton::clicked,[=](){ui->stackedWidget->setCurrentIndex(2);});//btn3按钮connect(ui->btn3,&QPushButton::clicked,[=](){ui->stackedWidget->setCurrentIndex(0);});}Widget::~Widget()
{delete ui;
}

(2)下拉框   

 ui->comboBox->addItem("奔驰");

#include "widget.h"
#include "ui_widget.h"
#include <QMovie>
Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);//下拉框ui->comboBox->addItem("奔驰");ui->comboBox->addItem("宝马");ui->comboBox->addItem("拖拉机");//点击按钮  选中宝马connect(ui->btnt,&QPushButton::clicked,[=](){//ui->comboBox->setCurrentIndex(2);ui->comboBox->setCurrentText("宝马");});}Widget::~Widget()
{delete ui;
}

(3)QLabel 显示图片

ui->lbl_Image->setPixmap(QPixmap(":/Image/butterfly.png"))

#include "widget.h"
#include "ui_widget.h"
#include <QMovie>
Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);//利用QLabel显示图片ui->lbl_image->setPixmap(QPixmap(":/Image/butterfly.png"));}Widget::~Widget()
{delete ui;
}

(4)QLabel显示动图gif图片

ui->lbl_movie->setMovie(movie);

movie->start();

#include "widget.h"
#include "ui_widget.h"
#include <QMovie>
Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);//利用QLabel显示动态图片QMovie * movie = new QMovie(":/Image/mario.gif");ui->lbl_movie->setMovie(movie);//播放动图movie->start();
}Widget::~Widget()
{delete ui;
}

(5)完整代码 

#include "widget.h"
#include "ui_widget.h"
#include <QMovie>
Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);//栈控件使用//设置默认定位页面ui->stackedWidget->setCurrentIndex(0);//btn1按钮connect(ui->btn1,&QPushButton::clicked,[=](){ui->stackedWidget->setCurrentIndex(1);});//btn2按钮connect(ui->btn2,&QPushButton::clicked,[=](){ui->stackedWidget->setCurrentIndex(2);});//btn3按钮connect(ui->btn3,&QPushButton::clicked,[=](){ui->stackedWidget->setCurrentIndex(0);});//下拉框ui->comboBox->addItem("奔驰");ui->comboBox->addItem("宝马");ui->comboBox->addItem("拖拉机");//点击按钮  选中宝马connect(ui->btnt,&QPushButton::clicked,[=](){//ui->comboBox->setCurrentIndex(2);ui->comboBox->setCurrentText("宝马");});//利用QLabel显示图片ui->lbl_image->setPixmap(QPixmap(":/Image/butterfly.png"));//利用QLabel显示动态图片QMovie * movie = new QMovie(":/Image/mario.gif");ui->lbl_movie->setMovie(movie);//播放动图movie->start();
}Widget::~Widget()
{delete ui;
}

 

三、自定义控件

在搭建Qt窗口界面的时候,在一个项目中很多窗口,或者是窗口中的某个模块会被经常性的重复使用。一般遇到这种情况我们都会将这个窗口或者模块拿出来做成一个独立的窗口类,以备以后重复使用。

在使用Qt的ui文件搭建界面的时候,工具栏栏中只为我们提供了标准的窗口控件,如果我们想使用自定义控件怎么办?

我们从QWidget派生出一个类SmallWidget,实现了一个自定窗口

1.samllWidget.h

提供 getNum  和 setNum对外接口

#ifndef SAMLLWIDGET_H
#define SAMLLWIDGET_H#include <QWidget>namespace Ui {
class samllWidget;
}class samllWidget : public QWidget
{Q_OBJECTpublic:explicit samllWidget(QWidget *parent = nullptr);~samllWidget();//设置数字void setNum(int num);//获取数字int getNum();private:Ui::samllWidget *ui;
};#endif // SAMLLWIDGET_H

2.samllWidget.cpp

实现功能,改变数字,滑动条跟着移动 ,信号槽监听

#include "samllwidget.h"
#include "ui_samllwidget.h"samllWidget::samllWidget(QWidget *parent) :QWidget(parent),ui(new Ui::samllWidget)
{ui->setupUi(this);//QSpinBox移动   QSlider跟着移动void(QSpinBox:: * spSignal)(int) = &QSpinBox::valueChanged;connect(ui->spinBox,spSignal,ui->horizontalSlider,&QSlider::setValue);// QSlider滑动   QSpinBox数字跟着改变connect(ui->horizontalSlider,&QSlider::valueChanged,ui->spinBox,&QSpinBox::setValue);
}//设置数字
void samllWidget::setNum(int num)
{ui->spinBox->setValue(num);
}
//获取数字
int samllWidget::getNum()
{return ui->spinBox->value();
}samllWidget::~samllWidget()
{delete ui;
}

3.samllWidget.ui 

.ui中 设计 QSpinBox和QSlider 两个控件

Widget中使用自定义控件,拖拽一个Widget,点击提升为,点击添加,点击提升

弹出提升窗口部件对话框

添加要提升的类的名字,然后选择 添加

添加之后,类名会显示到上边的列表框中,然后单击提升按钮,完成操作.

我们可以看到, 这个窗口对应的类从原来的QWidget变成了SmallWidget

再次运行程序,这个widget_3中就能显示出我们自定义的窗口了.

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

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

相关文章

改变世界-生成式人工智能

麦肯锡在其《生成人工智能的经济潜力&#xff1a;下一个生产力前沿》中声称&#xff0c;“ChatGPT、GitHub Copilot、Stable Diffusion 等生成式人工智能应用程序以 AlphaGo 没有的方式吸引了世界各地人们的想象力&#xff0c;这要归功于它们广泛的实用性——几乎任何人都可以使…

动态代理初步了解

准备案例 需求 模拟某企业用户管理业务&#xff0c;需包含用户登录&#xff0c;用户删除&#xff0c;用户查询功能&#xff0c;并要统计每个功能的耗时。 分析与实现 定义一个UserService表示用户业务接口&#xff0c;规定必须完成用户登录&#xff0c;用户删除&#xff0c…

2019年[海淀区赛 第2题] 阶乘

题目描述 n的阶乘定义为n!n*(n -1)* (n - 2)* ...* 1。n的双阶乘定义为n!!n*(n -2)* (n -4)* ...* 2或n!!n(n - 2)*(n - 4)* ...* 1取决于n的奇偶性&#xff0c;但是阶乘的增长速度太快了&#xff0c;所以我们现在只想知道n!和n!!末尾的的个数 输入格式 一个正整数n &#xff…

华为OD七日集训第7期 - 按算法分类,由易到难,循序渐进,玩转OD

目录 一、适合人群二、本期训练时间三、如何参加四、7日集训第7期五、精心挑选21道高频100分经典题目&#xff0c;作为入门。第1天、逻辑分析第2天、字符串处理第3天、数据结构第4天、递归回溯第5天、二分查找第6天、深度优先搜索dfs算法第7天、动态规划 六、集训总结 大家好&a…

基于Stable Diffusion的图像合成数据集

当前从文本输入生成合成图像的模型不仅能够生成非常逼真的照片&#xff0c;而且还能够处理大量不同的对象。 在论文“评估使用稳定扩散生成的合成图像数据集”中&#xff0c;我们使用“稳定扩散”模型来研究哪些对象和类型表现得如此逼真&#xff0c;以便后续图像分类正确地分配…

【C++】Stack Queue -- 详解

一、stack的介绍和使用 1、stack的介绍 https://cplusplus.com/reference/stack/stack/?kwstack 1. stack 是一种容器适配器&#xff0c;专门用在具有后进先出操作的上下文环境中&#xff0c;其删除只能从容器的一端进行元素的插入与提取操作。 2. stack 是作为容器适配器被…

Docker Mysql实战:docker compose 搭建Mysql

1、docker-compose-mysql文件准备 进入/home/docker目录&#xff0c;新建docker-compose-mysql.yml文件&#xff0c;内容如下&#xff1a; version: 3.0 services:mysql:image: "mysql:5.7"container_name: "mysql"environment:MYSQL_ROOT_PASSWORD: &q…

Java中树形菜单的实现方式(超全详解!)

前言 这篇文中&#xff0c;我一共会用两种方式来实现目录树的数据结构&#xff0c;两种写法逻辑是一样的&#xff0c;只是一种适合新手理解&#xff0c;一种看着简单明了但是对于小白不是很好理解。在这里我会很详细的讲解每一步代码&#xff0c;主要是方便新人看懂&#xff0…

从0开始python学习-31.selenium 文本输入框、下拉选择框、文件上传、时间插件选择元素定位

目录 1. 纯文本输入框 2. 存在默认值的文本输入 3. 下拉选择框 4. 输入后下拉选择框 5. 文件上传 6. 时间插件 1. 纯文本输入框 driver.find_element(By.XPATH,/html/body/div[2]/td[2]/input).send_keys(测试名称) 2. 存在默认值的文本输入 注意&#xff1a; 1. 这种存…

AQS内部的体系架构

AQS本质上是一个双向队列&#xff0c;加一个状态位state。内部靠Node节点形成队列。 AQS由state和CLH变体的虚拟双端队列组成。 AQS的内部类Node类 属性说明&#xff1a; 内部结构&#xff1a;

上门按摩小程序|同城上门按摩软件开发|上门按摩系统;

上门按摩小程序的开发具有许多优势&#xff0c;下面就给大家介绍下按摩小程序功能: 上门按摩小程序的优势 方便快捷&#xff1a;上门按摩小程序提供在线预约服务&#xff0c;用户可以通过手机随时随地预约按摩师上门服务&#xff0c;避免了传统预约方式的繁琐和不确定性。 个性…

TCP/IP网络协议通信函数接口

创建套接字函数 socket 【头文件】 #include <sys/types.h> #include <sys/socket.h> 【函数原型】 int socket(int domain, int type, int protocol); 【函数功能】 socket 函数创建一个通信端点&#xff0c;并返回一个引用该端点的文件描述符&#xff0c;…

IDEA2021创建Web项目配置Tomcat

1.新建一个普通的项目。 2.右键新建的项目&#xff0c;选择添加框架支持 3.勾选web application 4.在WEB-INF里创建lib和classes文件夹 5.file-project structure-modules-paths&#xff0c;选择use module compile output path&#xff0c;将output path和test output path的路…

基于FPGA的I2C读写EEPROM

文章目录 前言一、I2C协议1.1 I2C协议简介1.2 物理层1.3 协议层 二、EEPROM2.1 型号及硬件规格2.2 各种读写时序 三、状态机设计四、项目源码&#xff1a;五、实现效果参考资料 前言 本次项目所用开发板FPGA芯片型号为&#xff1a;EP4CE6F17C8 EEPROM芯片型号为&#xff1a;24L…

Linux CentOS7 yum仓库

在windows下安装一个软件很轻松&#xff0c;只要双击setup或者.exe的文件&#xff0c;安装提示连续“下一步”即可&#xff0c;然而linux系统下安装一个软件似乎并不那么轻松&#xff0c;因为我们不是在图形界面下。 本文我们将讨论如何在linux下安装一个软件。 一、linux软件…

混淆技术研究笔记(二)yGuard入门

yGuard官方文档地址&#xff1a;https://yworks.github.io/yGuard/index.html yGuard官方文档包含了比较全面的内容&#xff0c;由于文档是英文的&#xff0c;而且文档翻译后的浏览效果不是特别好&#xff0c;所以看文档入门有点难度。 这个系列的重点是混淆&#xff0c;所以…

4.物联网射频识别,RFID开发【智能门禁项目】

补充&#xff1a;学习路径 一。项目介绍及需求分析 1.酒店智能门禁使用场景介绍 1.客人入住 客人在前台办理入住手续&#xff0c;前台管理员通过门禁管理系统为客户开一张门禁卡 客户持卡到相应客房&#xff0c;用IC 卡刷卡开门 客人过了入住时间后&#xff0c;卡自动失效&a…

Linux自用笔记

✅作者简介&#xff1a;大家好&#xff0c;我是Leo&#xff0c;热爱Java后端开发者&#xff0c;一个想要与大家共同进步的男人&#x1f609;&#x1f609; &#x1f34e;个人主页&#xff1a;Leo的博客 &#x1f49e;当前专栏&#xff1a; Linux相关 ✨特色专栏&#xff1a; My…

【网络安全 ---- 靶场搭建】凡诺企业网站管理系统靶场详细搭建过程(asp网站,练习sql注入)

一&#xff0c;资源下载 百度网盘资源下载链接&#xff1a;百度网盘 请输入提取码百度网盘为您提供文件的网络备份、同步和分享服务。空间大、速度快、安全稳固&#xff0c;支持教育网加速&#xff0c;支持手机端。注册使用百度网盘即可享受免费存储空间https://pan.baidu.com…

HDMI简介

VGA接口 VGA传输红绿蓝模拟信号和同步信号。因传输的模拟信号&#xff0c;易受干扰&#xff0c;因此&#xff0c;在高分辨率下字体容易虚&#xff0c;信号线长的话&#xff0c;图像有拖尾现象。目前一些显示器已经不带VGA接口&#xff0c;取而代之的是HDMI和DP接口。 如下图所示…