C++ Qt开发:PushButton按钮组件

news2024/12/23 11:58:09

Qt 是一个跨平台C++图形界面开发库,利用Qt可以快速开发跨平台窗体应用程序,在Qt中我们可以通过拖拽的方式将不同组件放到指定的位置,实现图形化开发极大的方便了开发效率,本章将重点介绍QPushButton按钮组件的常用方法及灵活运用。

QPushButton 是 Qt 框架中用于创建按钮的组件类,是 QWidget 的子类。按钮是用户界面中最常见的交互元素之一,用于触发特定的操作或事件。该组件具有丰富的属性和方法,使其在不同的应用场景中能够灵活运用。

以下是 QPushButton 类中常用的一些方法,包括说明和简要概述:

方法说明
QPushButton(const QString &text, QWidget *parent = nullptr)构造函数,创建一个带有指定文本和父对象的按钮。
void setText(const QString &text)设置按钮的文本。
QString text() const获取按钮的文本。
void setIcon(const QIcon &icon)设置按钮的图标。
QIcon icon() const获取按钮的图标。
void setCheckable(bool checkable)设置按钮是否可切换状态。
bool isCheckable() const检查按钮是否可切换状态。
void setChecked(bool checked)设置按钮的切换状态。
bool isChecked() const获取按钮的当前切换状态。
void setEnabled(bool enabled)启用或禁用按钮。
bool isEnabled() const检查按钮是否启用。
void setDefault(bool isDefault)设置按钮是否为默认按钮。
bool isDefault() const检查按钮是否为默认按钮。
void click()模拟按钮点击。
void setFlat(bool flat)设置按钮是否为平面按钮。
bool isFlat() const检查按钮是否为平面按钮。
void show()显示按钮。

这些方法提供了丰富的功能,使得 QPushButton 可以适应不同的界面需求。通过设置文本、图标、切换状态等属性,以及连接点击事件等,可以实现按钮的各种交互效果。

PushButton 的使用有两种方式,读者可以直接在图形界面上面拖拽来使用,也可以通过new QPushButton的方式动态的创建生成。

1.1 代码方式创建

首先我们以第一种纯代码的方式来使用PushButton组件,读者需要导入#include <QPushButton>类,导入后可以使用new关键词创建一个按钮组件。

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <iostream>
#include <QPushButton>

// 设置函数,用于绑定事件
void Print()
{
    std::cout << "hello lyshark" << std::endl;
}

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

    // 创建[退出]按钮
    QPushButton * btn = new QPushButton;   // 创建一个按钮
    // btn->show();                        // 用顶层方法弹出按钮
    btn->setParent(this);                  // 设置父窗体(将btn内嵌到主窗体中)
    btn->setText("退出");                   // 设置按钮text显示
    btn->move(100,20);                     // 移动按钮位置
    btn->resize(100,50);                   // 设置按钮大小
    btn->setEnabled(true);                 // 设置是否可被点击

    // 创建[触发信号]按钮
    QPushButton * btn2 = new QPushButton("触发信号",this);
    btn2->setParent(this);
    btn2->move(100,100);
    btn2->resize(100,50);

    // 设置主窗体常用属性
    this->resize(300,200);              // 重置窗口大小,调整主窗口大小
    this->setWindowTitle("我的窗体");    // 重置主窗体的名字
    this->setFixedSize(300,200);        // 固定窗体大小(不让其修改)
    // this->showFullScreen();          // 设置窗体全屏显示

    // 设置主窗体特殊属性
    // setWindowFlags(Qt::FramelessWindowHint | Qt::WindowStaysOnTopHint); // 隐藏标题栏

    // 为按钮绑定事件 connect(信号的发送者,发送的信号,信号的接受者,处理的函数(槽函数))
    connect(btn,&QPushButton::clicked,this,&QWidget::close);

    // 将窗体中的 [触发信号] 按钮,连接到Print函数中.
    connect(btn2,&QPushButton::clicked,this,&Print);

}

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

上述代码中我们通过new QPushButton的方式创建了两个按钮,并分别调整了按钮的常规属性包括按钮的高度宽度以及按钮的大小、按钮标题等,通过connect分别为按钮绑定了两个事件,以用于推出和触发打印函数,读者可自行运行代码观察变化;

1.2 图形界面创建

通过图形界面的创建很简单,只需要拖拽控件Qt会帮我们做完所有的工作,这里我们就重点说说Qt中的QSS组件库的使用,Qt Style Sheets(QSS)是一种用于定义Qt应用程序外观和样式的样式表语言。类似于HTML和CSS中的样式表,QSS允许开发者通过简单的样式规则来定义Qt界面的外观,包括控件的颜色、字体、边框、背景等。

使用QSS,开发者可以很容易地改变应用程序的外观,使其适应不同的用户界面设计需求,或者根据应用程序的主题进行个性化定制。

QSS可以通过在组件上直接追加属性的方式实现,通过使用setStyleSheet属性可以很容易的对特定的组件进行着色操作,如下我们将第一个pushButton设置为黄色可以这样写;

//设置pushButton的背景颜色为黄色
ui->pushButton->setStyleSheet("background:yellow");

当然了如果我们将ui->指定传入this->则会对当前整个页面生效,当如下界面被执行时则整个页面会变成蓝色;

this->setStyleSheet("background:blue");

除了使用代码来设置样式表外,也可以在设计模式中为添加到界面上的部件设置样式表,这样更加直观。先注释掉上面添加的代码,然后进入设计模式。在界面上右击,在弹出的菜单中选择“改变样式表”,这时会出现编辑样式表对话框,在其中输入如下代码,如图;

则此时将会针对所有的pushButton组件生效,当程序运行时所有的组件都见变为蓝色,当然了在某些时候我们还是希望能对单独的组件进行控制,例如将第二个按钮上色第一个保持不变,则此时需要将规则由;

QPushButton{
	background-color: rgb(0, 0, 255);
}

更改为QPushButton组件名外加#紧随其后的是ObjectName对象名pushButton_2,那么就要写成如下规则;

QPushButton#pushButton_2{
	background-color: rgb(0, 0, 255);
}

此时再次运行程序,则只有第二个按钮被标记为蓝色,第一个按钮将会保持默认色,如下图;

当然这样的配色显然是无法正常使用的,如果读者学过前端应该知道使用CSS如何美化按钮,QSS也支持CSS中的各种事件,我们以按钮的普通状态,按下抬起为例,将如下QSS设置到组件上。

/*按钮普通态*/
QPushButton
{
    /*字体为微软雅黑*/
    font-family:Microsoft Yahei;
    /*字体大小为20点*/
    font-size:20pt;
    /*字体颜色为白色*/    
    color:white;
    /*背景颜色*/  
    background-color:rgb(14 , 150 , 254);
    /*边框圆角半径为8像素*/ 
    border-radius:8px;
}

/*按钮停留态*/
QPushButton:hover
{
    /*背景颜色*/  
    background-color:rgb(44 , 137 , 255);
}

/*按钮按下态*/
QPushButton:pressed
{
    /*背景颜色*/  
    background-color:rgb(14 , 135 , 228);
    /*左内边距为3像素,让按下时字向右移动3像素*/  
    padding-left:3px;
    /*上内边距为3像素,让按下时字向下移动3像素*/  
    padding-top:3px;
}

此时会呈现三种状态,当默认未被选中时会使用QPushButton来渲染,而QPushButton:hover则用于悬停时的显示,最后的QPushButton:pressed则是被按下是的颜色渲染,如下所示;

接着我们来看一下如何添加背景图片到Qt中并使用QSS将背景附加到PushButton上,首先分别准备一些素材文件,这里提供三个不同的png图片;

下面是普通态的背景图,用了同一张背景图:

下面是悬停态的背景图:

下面是按下态的背景图:

接着就是要把这些图片添加到Qt中的资源中去,在项目主目录上右键选中Add New...按钮,并找到Qt下的Qt Resource File选项卡,并点击Choose...按钮,如下图;

读者可自行命名该资源名称这里我就叫lyshark.qrc,接着就需要点击Add Prefix按钮,并在项目根目录新建一个lyshark目录并将所需文件拖拽到该目录下,如下图;

继续点击AddFiles按钮依次选中资源并添加到项目源文件中,当添加结束后按下Ctrl+S保存RC文件,即可看到如下图所示;

样式表设置背景图可以使用setStyleSheet函数,在程序里设置按钮的样式表,具体程序如下所示:

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

    // 美化第一个按钮
    ui->pushButton->setStyleSheet(
                "QPushButton{border-image: url(:/new/lyshark/Qt_threeStatus_ok.png);}"
                "QPushButton:hover{border-image: url(:/new/lyshark/Qt_threeStatus_ok1.png);}"
                "QPushButton:pressed{border-image: url(:/new/lyshark/Qt_threeStatus_OK2.png);}"
                );

    // 美化第二个按钮
    ui->pushButton2->setStyleSheet(
                "QPushButton{border-image: url(:/new/lyshark/Qt_threeStatus_ok.png);}"
                "QPushButton:hover{border-image: url(:/new/lyshark/Qt_threeStatus_ok1.png);}"
                "QPushButton:pressed{border-image: url(:/new/lyshark/Qt_threeStatus_OK2.png);}"
                );
}

也可以在 QtDesigner 上,即ui文件上的按钮处编辑样式表,如下所示:

QPushButton{border-image: url(:/new/lyshark/Qt_threeStatus_ok.png)}
QPushButton:hover{border-image: url(:/new/lyshark/Qt_threeStatus_ok1.png)}
QPushButton:pressed{border-image: url(:/new/lyshark/Qt_threeStatus_OK2.png)}

运行上述代码后将分别美化两个按钮,并输出如下图所示;

当然,此类按钮的美化完全可以使用QSS来实现并不需要导入样式图,这种方法比上面用图标作为背景的好处就是可以不需要设计背景图,而且在样式不设置字体的情况下,可以随意更改文字以及文字的大小、位置、字体等显示效果。

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

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

相关文章

【广州华锐互动】AR昆虫在线教学软件:增强现实技术带你近距离探索微观世界

随着科技的不断发展&#xff0c;教育方式也在不断创新。在这个信息爆炸的时代&#xff0c;传统的教育方式已经无法满足人们对知识的渴望。为了让孩子们更好地了解自然界的奥秘&#xff0c;一款名为“AR昆虫在线教学软件”的应用程序应运而生&#xff0c;它将带领孩子们踏上一段…

gpu版本的GNN的demo

1、当涉及到在GPU上运行图神经网络&#xff08;GNN&#xff09;时&#xff0c;通常使用深度学习框架&#xff0c;如PyTorch或TensorFlow。在这里&#xff0c;我将为您提供一个使用PyTorch Geometric库实现GNN的简单示例。 首先&#xff0c;确保您已经安装了PyTorch和PyTorch G…

dockerfile:创建镜像的方式,船舰自定义的镜像

dockerfile&#xff1a;创建镜像的方式&#xff0c;船舰自定义的镜像 包括配置文件&#xff0c;挂载点&#xff0c;对外暴露的端口&#xff0c;设置环境变量 docker创建镜像的方式 1、基于已有镜像进行创建。 根据官方提供的镜像源&#xff0c;创建镜像&#xff0c;然后拉起…

IT鄙视链:码农之间的情感大戏与编程语言间的较量

在IT圈&#xff0c;茶余饭后的谈资总离不开技术、产品、市场和那些看似高深莫测的“鄙视链”。这些鄙视链&#xff0c;就像一场没有硝烟的战争&#xff0c;把原本应该和谐交流的技术社区变成了一场争夺鄙视链顶端的激战。今天&#xff0c;就让我来为您揭示这个神秘的IT鄙视链。…

CSS 实现丝滑动画

效果展示 CSS 知识点 animation 综合运用 页面整体布局 <div class"box"><div class"circle"></div> </div>编写基础样式 .box {position: relative;width: 400px;height: 400px;border: 80px solid transparent;border-left:…

JVM虚拟机系统性学习-类加载子系统

类加载子系统 类加载的时机 类加载的时机主要有 4 个&#xff1a; 遇到 new、getstatic、putstatic、invokestatic 这四条字节码指令时&#xff0c;如果对应的类没有初始化&#xff0c;则要先进行初始化 new 关键字创建对象时读取或设置一个类型的静态字段时&#xff08;被 …

12.10_黑马数据结构与算法笔记Java

目录 058 链表 e10 判环算法1 thinking&#xff1a;什么是空指针&#xff1f; 058 链表 e10 判环算法2 059 数组 e01 合并有序数组1 059 数组 e01 合并有序数组2 060 队列 链表实现1 061 队列 链表实现2 062 队列 环形数组实现 方法1-1 063 队列 环形数组实现 方法1-2…

CV计算机视觉每日开源代码Paper with code速览-2023.12.5

点击计算机视觉&#xff0c;关注更多CV干货 论文已打包&#xff0c;点击进入—>下载界面 点击加入—>CV计算机视觉交流群 1.【基础网络架构&#xff1a;Transformer】GIFT: Generative Interpretable Fine-Tuning Transformers 论文地址&#xff1a;https://arxiv.org…

计算机网络——期末考试复习资料

什么是计算机网络 将地理位置不同的具有独立功能的多台计算机及其外部设备通过通信线路和通信设备连接起来&#xff1b;实现资源共享和数据传递的计算机的系统。 三种交换方式 报文交换&#xff1a;路由器转发报文&#xff1b; 电路交换&#xff1a;建立一对一电路 分组交换&a…

carla安装中的问题

1、carla carla安装完后&#xff0c;需要使用python调用API去更换地图&#xff0c;增加车辆等 使用Python调用API过程中可能会报错&#xff1a; 报错1&#xff1a;carla API&#xff08;Carla包&#xff09;版本不对 **解决方法&#xff1a;**需要将这个目录下的三个文件拷…

IDEA已经导入了jar包 还是提示找不到类(解决!!!)

项目代码check到本地,导入到idea中后,编译的时候很多类都报错了,打开发现有些框架中的类找不到。 报错:xxxx程序包找不到,xxxx类找不到 类似我框起来的地方是 报红的,utils这个包都找不到 解决方法: 网上1: 项目是依赖了这个jar包的,打开项目配置,查看依赖树: id…

2023.12.9 关于 Spring Boot 事务传播机制详解

目录 事务传播机制 七大事务传播机制 支持当前调用链上的事务 Propagation.REQUIRED Propagation.SUPPORTS Propagation.MANDATORY 不支持当前调用链上的事务 Propagation.REQUIRES_NEW Propagation.NOT_SUPPORTED Propagation.NEVER 嵌套事务 Propagation.NESTED…

优化您的Mac电脑风扇控制体验 - 尝试Macs Fan Control Pro!

在日常使用Mac电脑过程中&#xff0c;我们经常会遇到电脑发热的问题&#xff0c;特别是在运行大型软件或进行高负载任务时。为了保护电脑硬件&#xff0c;一个高效且可靠的风扇控制软件是必不可少的。 Macs Fan Control Pro是一款专为Mac电脑设计的风扇控制软件&#xff0c;它…

区块链技术是什么?解析其基本原理及应用

区块链技术的基本原理 在数字化时代的推动下&#xff0c;区块链技术作为一项革命性的创新&#xff0c;正逐渐渗透到各个领域&#xff0c;引领着未来科技的发展。区块链技术的基本原理大致可以总结为以下 4 点内容&#xff1a; 1. 去中心化&#xff1a;区块链是一个去中心化…

三(二)ts非基础类型(枚举)

数字枚举 使用enum定义一个枚举类型 enum Color {red,yellow,blue } let clr: Color Color.red如上面代码中&#xff0c;我们定义了一个关于颜色的枚举类型&#xff0c;里面的值会从0开始依次递增&#xff0c;也就是说Color.red为0&#xff0c;Color.yellow为1依次类推。当然…

渲染技术在虚拟仿真中的应用

虚拟仿真&#xff08;Virtual Reality&#xff09;是一种仿真技术&#xff0c;它使用计算机生成一个虚拟世界&#xff0c;用户可以通过各种传感通道与这个虚拟世界进行自然的交互。虚拟仿真技术可以创建和体验虚拟世界&#xff0c;使用户可以像在真实世界中一样进行操作和体验。…

Python - 深夜数据结构与算法之 ArrayList

目录 一.引言 二.ArrayList 介绍 1.List 2.Linked List 3.Skip List 三.经典算法实战 1.Two-Sum [1] 2.Three-Sum [15] 3.Merge-Two-Sorted-List [21] 4.Remove-Duplicates-From-Sorted-Array [26] 5.Plus-One [66] 6.Rotate-Array [189] 7. Move-Zero [283] 四.…

如何公网访问内网的群晖NAS随时随地远程访问本地存储的学习资源

文章目录 前言本教程解决的问题是&#xff1a;按照本教程方法操作后&#xff0c;达到的效果是前排提醒&#xff1a; 1. 搭建群晖虚拟机1.1 下载黑群晖文件vmvare虚拟机安装包1.2 安装VMware虚拟机&#xff1a;1.3 解压黑群晖虚拟机文件1.4 虚拟机初始化1.5 没有搜索到黑群晖的解…

双向链表(数据结构与算法)

✅✅✅✅✅✅✅✅✅✅✅✅✅✅✅✅ ✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨ &#x1f33f;&#x1f33f;&#x1f33f;&#x1f33f;&#x1f33f;&#x1f33f;&#x1f33f;&#x1f33f;&#x1f33f;&#x1f33f;&#x1f33f;&#x1f33f;&#x1f33f;&#x1f33f;&#x1…

基于Java的商城网站系统设计与实现(6000字论文范例)

基于Java的商城网站系统设计与实现 姓 名&#xff1a; 刘德华 学 号&#xff1a; 指导教师&#xff1a; 2023年4月 摘要 随着我国经济活力的不断提升和互联网的快速发展&#xff0c;信息的重要性正在…