【QT入门】Qt自定义控件与样式设计之自定义QLineEdit实现搜索编辑框

往期回顾

【QT入门】Qt自定义控件与样式设计之qss的加载方式-CSDN博客

【QT入门】Qt自定义控件与样式设计之控件提升与自定义控件-CSDN博客

【QT入门】Qt自定义控件与样式设计之鼠标相对、绝对位置、窗口位置、控件位置-CSDN博客

 【QT入门】Qt自定义控件与样式设计之自定义QLineEdit实现搜索编辑框

一、最终效果

正常样式结果:

当我们把鼠标放在按钮上时:

 二、具体实现

其实思路很简单,就是自定义一个搜索栏控件,在搜索栏控件里再增加一个自定义按钮控件,最后设置布局就实现了。

1、自定义按钮

1.1重写鼠标事件

主要是样式表的设计,因为需要设计两个样式,打开正常显示一个,鼠标放上去又是一个,这也就涉及到要重载鼠标进入和离开事件 。

class CSearchButton : public QPushButton
{
    Q_OBJECT
public:
    CSearchButton(QWidget *parent = nullptr);

private:
    //正常样式,也就是打开看到的,由于复用次数高,所以用一个方法
    void normalStyle();

protected:
    //重载鼠标进入和离开事件
    void enterEvent(QEvent *event) override;
    void leaveEvent(QEvent *event) override;
};
1.2设置样式和高度

在.cpp文件里要注意设置高度,另外就是不要让父窗口影响子窗口样式 

CSearchButton::CSearchButton(QWidget *parent)
    :QPushButton(parent)
{
    //防止父窗口影响子窗口样式
    this->setAttribute(Qt::WA_StyledBackground);

    //设置固定高度,因为要保证跟搜索框的一样
    this->setFixedHeight(40);

    //正常样式,因为鼠标放上去样式会改变
    normalStyle();
}
1.3重写鼠标事件添加qss样式

 就是在重写的鼠标进入和离开两个事件方法里写qss样式。

1.3.1enterEvent(QEvent *event)
//鼠标放上去后样式改变
void CSearchButton::enterEvent(QEvent *event)
{
    string qss = R"(QPushButton{
            background-color:#148AFF;
            background-image: url(:/resources/search.png);
            background-repeat: no-repeat;
            background-position:left;
            background-origin:content;
            padding-left:15px; /*图片相对于左边的偏移*/
            text-align:right;  /*文本的对齐方式*/
            padding-right:15px; /*文本相对于右边的偏移*/
            border-radius:20px;
            color:#FFFFFF;
            font-family: \"Microsoft YaHei\";
            font-size: 20px;
        })";

    //设置样式,string转QString,用fromStdString
    this->setStyleSheet(QString::fromStdString(qss));

    //设置固定宽度,因为鼠标放上去了样式改变,宽度也会变
    this->setFixedWidth(130);
    this->setText(u8"搜全网");
}

这里有一个很细节的地方:偏移值设置和对齐方式 

             background-origin:content;
            padding-left:15px; /*图片相对于左边的偏移*/
            text-align:right;  /*文本的对齐方式*/
            padding-right:15px; /*文本相对于右边的偏移*/

 1.3.2leaveEvent(QEvent *event)
//鼠标离开后就恢复正常样式
void CSearchButton::leaveEvent(QEvent *event)
{
    normalStyle();
}

//正常样式,一样的
void CSearchButton::normalStyle()
{
    string qss = R"(QPushButton{
            background-color:#148AFF;
            background-image: url(:/resources/search.png);
            background-repeat: no-repeat;
            background-position: center;
            border-radius:20px;
        })";

    this->setStyleSheet(QString::fromStdString(qss));

    this->setFixedWidth(60);
    this->setText(u8"");
}

注意两个样式的按钮宽度是不一样的,在搜索栏控件里要考虑到这一点。

2、自定义搜索栏

2.1添加按钮设计

这一步主要是设计搜索栏样式和把做好的按钮加进来,加进来的时候要考虑到最终的ui界面,同时设置一个信号,主要是点击搜索按钮后发送这个信号,此时就可以在widget类接收信号并做进一步处理

2.1.1CSearchLineEdit.h
class CSearchLineEdit : public QLineEdit
{
    Q_OBJECT
public:
    CSearchLineEdit(QWidget *parent = nullptr);

signals:
    //鼠标点击搜索按钮后触发搜索信号
    void sig_Search(const QString& text);

private:
    //定义一个搜索按钮控件
    CSearchButton* m_pBtn = nullptr;
};
2.1.2CSearchLineEdit.cpp 
#include "csearchlineedit.h"
#include <string>
#include <QHBoxLayout>

using namespace std;

CSearchLineEdit::CSearchLineEdit(QWidget *parent)
    :QLineEdit(parent)
{
    //防止父类窗口影响子类样式 
    this->setAttribute(Qt::WA_StyledBackground);

    string qss = R"(
            QLineEdit{
                background-color:#33373E;     /* 背景颜色 */
                border: 1px solid #33373E;      /* 边框宽度为1px,颜色为#A0A0A0 */
                border-radius: 20px;         /* 边框圆角 */
                padding-left: 10px;           /* 文本距离左边界有5px */
                color: #FFFFFF;     /* 文本颜色 */
                selection-background-color: #A0A0A0;     /* 选中文本的背景颜色 */
                selection-color: #F2F2F2;    /* 选中文本的颜色 */
                font-family: \"Microsoft YaHei\";    /* 文本字体族 */
                font-size:18px;    /* 文本字体大小 */
            }
        )";

    //设置样式
    this->setStyleSheet(QString::fromStdString(qss));
    //这个是设置未输入时的提示内容
    this->setPlaceholderText(u8"请输入搜索内容");

    //固定高度和最小宽度
    this->setFixedHeight(40);
    this->setMinimumWidth(400);

    m_pBtn = new CSearchButton(this);

    //创建水平布局
    QHBoxLayout* pHlay = new QHBoxLayout(this);
    pHlay->addStretch();//添加弹簧把按钮放最右边
    pHlay->addWidget(m_pBtn);
    pHlay->setContentsMargins(0,0,0,0);//这个很熟悉了,默认为11,所以都要设置

    //这是设置文字的margin(左上右下),这里右边设置为130+5,因为要把按钮位置空出来,所以是
    this->setTextMargins(10, 0, 130 + 5,0);

    connect(m_pBtn, &CSearchButton::clicked, [=]{
        emit sig_Search(this->text());
    });
}

注意:

.cpp文件布局里注意几个问题

第一个,用了stringR写样式,别忘了加头文件和命名空间 

#include <string>
using namespace std;

 第二个,搜索栏加了一个弹簧把按钮放在了最右边,不然默认是挤在中间的

    //创建水平布局
    QHBoxLayout* pHlay = new QHBoxLayout(this);
    pHlay->addStretch();//添加弹簧把按钮放最右边
    pHlay->addWidget(m_pBtn);

第三个,设置margins,一个是搜索栏和按钮之间的,也就是控件之间的,一个是搜索栏里的文字之间的,文字设置那要把按钮空间空出来,不然最后输入的文字会和按钮挤在一起

    pHlay->setContentsMargins(0,0,0,0);//这个很熟悉了,默认为11,所以都要设置

    //这是设置文字的margin(左上右下),这里右边设置为130+5,因为要把按钮位置空出来,所以是
    this->setTextMargins(10, 0, 130 + 5,0);

 3、widget创建布局放进去

Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);
    //设置窗口样式
    this->setStyleSheet("background-color:#1A1E21");
    //创建编辑栏
    CSearchLineEdit* pEdit = new CSearchLineEdit(this);
    //创建垂直布局,并把编辑栏放进去,由于就一个部件,垂直或者水平都行
    QVBoxLayout* pVLay = new QVBoxLayout(this);
    pVLay->addWidget(pEdit);
    pVLay->addStretch();
}

以上,就是自定义QLineEdit实现搜索编辑框的简单介绍

都看到这里了,点个赞再走呗朋友~

加油吧,预祝大家变得更强!

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

蓝桥杯之注意事项

1.特殊求解的地方 2.一些数学公式 比如二叉树求全深度数值那道题 3.掌握有关库函数 #include<algorithm> 包含sort&#xff08;&#xff09;函数【排列函数】C sort()排序详解-CSDN博客&#xff0c;next_permutation()函数【求解全排列问题】求解数组大小sizeof(arr…

2024年腾讯云最新优惠活动及领券入口整理分享

随着云计算技术的快速发展&#xff0c;越来越多的企业和个人选择将业务部署在云端。腾讯云作为国内知名的云计算服务提供商&#xff0c;为用户提供了丰富的云产品和服务。为了帮助用户降低成本&#xff0c;腾讯云定期推出各种优惠活动。本文将为大家整理分享2024年腾讯云的最新…

亲测能用MathType7破解版本安装包百度网盘下载

MathType 7是一款专业的数学公式编辑工具&#xff0c;广泛应用于教育教学、科研机构、工程学、物理学、化学等多个领域。它支持各种数学符号、公式、方程式、矩阵、分数、上下标等&#xff0c;几乎涵盖了所有的数学元素&#xff0c;可以帮助用户快速、方便地创建高质量的数学公…

【Cesium学习笔记】二、隐藏控件及按钮

【Cesium学习笔记】二、隐藏控件及按钮 一、隐藏控件二、隐藏cesium图标 Ps:本教程所有代码于同一个工程中&#xff0c;运行npm run dev默认首页为App.vue&#xff0c;只需替换App.vue的内容即可切换不同页面。 将上一节的App.vue保存为类似“加载cesium.vue”这种对应名称。 …

如何在Photoshop中,使用本地Stable Diffusion WebUI的绘图能力

&#x1f3c3;‍♂️文章背景 相信设计师朋友们最熟悉的软件应该就是photoshop了&#xff0c;现在AI绘图虽然控制性越来越强&#xff0c;但跟ps比起来&#xff0c;还是要弱很多&#xff0c;尤其是图层、蒙版、笔刷、色调校色等等功能&#xff0c;所以就算是使用SD或者midjourn…

虚拟机下CentOS7开启SSH连接

虚拟机下CentOS7开启SSH连接 自己在VMware中装了CentOS 6.3&#xff0c;然后主机&#xff08;或者说xshell&#xff09;与里面的虚拟机连不通&#xff0c;刚学习&#xff0c;一头雾水&#xff0c;查了半天&#xff0c;也不知道怎么弄。 在虚拟机&#xff08;Vmware Workstatio…

2024蓝桥A组A题

艺术与篮球&#xff08;蓝桥&#xff09; 问题描述格式输入格式输出评测用例规模与约定解析参考程序难度等级 问题描述 格式输入 无 格式输出 一个整数 评测用例规模与约定 无 解析 模拟就好从20000101-20240413每一天计算笔画数是否大于50然后天数&#xff1b; 记得判断平…

Linux 网络排查命令

端口相关服务检查 netstat -ntpl|grep [$Port]说明&#xff1a;[$Port]为相应的端口号。 0.0.0.0代表本机上可用的任意地址。比如&#xff0c;0.0.0.0:80表示本机上所有地址的80端口。 tcp 0.0.0.0:80表示在所有的可用接口上监听TCP的80端口 如果返回结果为空&#xff0c;说明…

rocketmq和rabbitmq总是分不清?

1. 官方解答 摘自百度搜索&#xff1a; 2. 通俗易懂的回答

【Liunx】一键式配置vim,这一篇就够了配图超丰富!

一、配置个性化vim 首先&#xff0c;进入自己的用户中&#xff0c;配置自己的vim时&#xff0c;是不会影响其他用户的。因为有关vim的配置取决于每个用户家目录下的一个配置文件.vimrc 接下来就去我的家目录下看看这个隐藏文件【.vimrc】 打开它&#xff0c;你会发现空空如也…

Vol.46 一个在线小游戏网站,每个月50万访问量

大家好&#xff0c;我是欧维Ove&#xff0c;今天要给大家分享的网站是&#xff1a;小霸王&#xff0c;这是一个可以在线玩小霸王游戏的网站&#xff0c;网址是&#xff1a;小霸王&#xff0c;其樂無窮。紅白機&#xff0c;FC線上遊戲&#xff0c;街機遊戲&#xff0c;街機線上&…

微服务之Consul 注册中心介绍以及搭建

一、微服务概述 1.1单体架构 单体架构&#xff08;monolithic structure&#xff09;&#xff1a;顾名思义&#xff0c;整个项目中所有功能模块都在一个工程中开发&#xff1b;项目部署时需要对所有模块一起编译、打包&#xff1b;项目的架构设计、开发模式都非常简单。 当项…

基于”Python+”多技术融合在蒸散发与植被总初级生产力估算中的应用

熟悉蒸散发ET及其组分&#xff08;植被蒸腾Ec、土壤蒸发Es、冠层截留Ei&#xff09;、植被总初级生产力GPP的概念和碳水耦合的基本原理&#xff1b;掌握利用Python与ArcGIS工具进行课程相关的操作&#xff1b;熟练掌握国际上流行的Penman-Monteith模型&#xff0c;并能够应用该…

网站防御技巧分享

本教程所用到了常接触的 Cloudflare 和宝塔防火墙等工具以下内容均为个人经验和观点&#xff0c;不代表其他人或所谓最佳做法 第一 WAF规则 正确配置防火墙规则可以规避大半可疑请求。 设置一个质询规则是至关重要的&#xff0c;如图所示&#xff1a; 您可以质询安全得分低于3…

电影《你想活出怎样的人生》观后感

上周去看了宫崎骏电影《你想活出怎样的人生》&#xff0c;就像作为导演问观众的一个问题一样&#xff0c;宫崎骏老爷子&#xff0c;在电影中&#xff0c;给出了他的一些开放式答案。自己可是说是宫崎骏的粉丝&#xff0c;宫崎骏老爷子的大部分电影&#xff0c;自己基本都看过了…

Chatgpt掘金之旅—有爱AI商业实战篇|播客剧本写作|(十三)

演示站点&#xff1a; https://ai.uaai.cn 对话模块 官方论坛&#xff1a; www.jingyuai.com 京娱AI 一、AI技术创业播客剧本写作服务有哪些机会&#xff1f; 人工智能&#xff08;AI&#xff09;技术作为当今科技创新的前沿领域&#xff0c;为创业者提供了广阔的机会和挑战。…

“Plandex:AI编程引擎革新,高效应对复杂任务“

Plandex Plandex 是一个开源的、基于终端的AI编程引擎&#xff0c;用于处理复杂任务。它通过长期运行的代理来完成跨越多个文件和多个步骤的任务&#xff0c;将大型任务分解为更小的子任务&#xff0c;然后逐个实现&#xff0c;直到完成整个工作。这有助于用户处理待办事项、处…

CSS快速入门

目录 一、CSS介绍 1、什么是CSS&#xff1f; ​编辑2、基本语法规范 3、引入方式 4、规范 二、CSS选择器 1、标签选择器 2、类&#xff08;class&#xff09;选择器 3、id选择器 4、通配符选择器 5、复合选择器 三、常用CSS 1、color 2、font-size 3、border 4…

pyqt和opencv结合01:读取图像、显示

在这里插入图片描述 1 、opencv读取图像用于pyqt显示 # image cv2.imread(file_path)image cv2.cvtColor(image, cv2.COLOR_BGR2RGB)# 将图像转换为 Qt 可接受的格式height, width, channel image.shapebytes_per_line 3 * widthq_image QImage(image.data, width, hei…

计算机网络常问面试题

一.HTTPS是如何保证安全传输的 https通过使⽤对称加密、⾮对称加密、数字证书等⽅式来保证数据的安全传输。 客户端向服务端发送数据之前&#xff0c;需要先建⽴TCP连接&#xff0c;所以需要先建⽴TCP连接&#xff0c;建⽴完TCP连接后&#xff0c;服务端会先给客户端发送公钥…