自定义QComboBox解决QCombobox设置样式并与QDateTime一起使用时候弹出选项乱跳

news/发布时间2024/8/25 18:50:08

头文件:

#pragma once

#include <QToolButton>
#include <QListView>
#include <QWidgetAction>
#include <QPushButton>
#include <QHBoxLayout>
#include <QMenu>
#include <QStandardItemModel>
#include <qdebug.h>

class CustomComBox : public QPushButton
{
Q_OBJECT
public:
CustomComBox();
CustomComBox(int index);
QListView * getList();//可以用来修改列表字体大小
int currentIndex();
void setCurrentIndex(int index);
QString currentText();
void setCurrentText(QString str);
void addItems(QStringList sstrList);
void clear();
private:
int _index;//版本控制
int _count;//当前comboBox总条数
QMenu *_menu;
QListView * _listView;
QWidgetAction* _widgetaction;
QWidget *_btnWidget;
QHBoxLayout* _layoutH;
QStandardItemModel *_ItemModel;
public slots:
void on_showClick(QModelIndex index);
protected:
void resizeEvent(QResizeEvent *event);

};

 

cpp文件:

#include "customcombox.h"
#include "../resource/resource_def.h"
CustomComBox::CustomComBox()
{
_index = 0;
_count = 0;
setFixedSize(100, 25);
//右侧长宽控制方向
//setPopupMode(QToolButton::InstantPopup);
_menu = new QMenu(this);
_listView = new QListView();
_widgetaction = new QWidgetAction(_listView);
_listView->setFrameShape(QFrame::NoFrame);//设置无边框
//设置弹出的菜单大小
_listView->setFixedSize(100,20);//没有的时候弄宽一点好看些
_widgetaction->setDefaultWidget(_listView);
_menu->addAction(_widgetaction);
setMenu(_menu);
_ItemModel = new QStandardItemModel(this);
QObject::connect(_listView, &QListView::clicked, this, &CustomComBox::on_showClick);//绑定事件
}

//不传0
CustomComBox::CustomComBox(int index)
{
_index = index;
_count = 0;
setFixedSize(100, 25);
//右侧长宽控制方向
//setPopupMode(QToolButton::InstantPopup);
_menu = new QMenu(this);
_listView = new QListView();
_widgetaction = new QWidgetAction(_listView);
_listView->setFrameShape(QFrame::NoFrame);//设置无边框
//设置弹出的菜单大小
_listView->setFixedSize(100, 20);//没有的时候弄宽一点好看些
_widgetaction->setDefaultWidget(_listView);
_menu->addAction(_widgetaction);
setMenu(_menu);
_ItemModel = new QStandardItemModel(this);
QObject::connect(_listView, &QListView::clicked, this, &CustomComBox::on_showClick);//绑定事件
}

QString CustomComBox::currentText()
{
return this->text();
}

int CustomComBox::currentIndex() {
return _listView->currentIndex().row();
}

void CustomComBox::addItems(QStringList strList) {
_ItemModel->clear();
_count = strList.size();
for (int i = 0; i < _count; i++)
{
QString string = static_cast<QString>(strList.at(i));
QStandardItem *item = new QStandardItem(string);
_ItemModel->appendRow(item);
if (i == 0) {
setText(string);
}
}
_listView->setModel(_ItemModel); // listview设置Model
if (_count > 0) {
int height = _count * _listView->sizeHintForRow(0);//自适应高度
_listView->setFixedHeight(height);//设置高度
}
if (strList.size() > 0) {
_listView->setCurrentIndex(_ItemModel->index(0, 0));
}

}

QListView* CustomComBox::getList() {
if (_listView != NULL) {
return _listView;
}
}


void CustomComBox::on_showClick(QModelIndex index)
{
QString strTemp;
strTemp = index.data().toString();
setText(strTemp);
int a = currentIndex();
QString text = currentText();
QString curInfo = QString("index:%1,indecText:%2").arg(a).arg(text);
qDebug(curInfo.toLocal8Bit().data());
_menu->hide();
}

void CustomComBox::setCurrentIndex(int index) {
int row = _ItemModel->rowCount();
if (index >= row) {
return;
}
QModelIndex modelIndex = _ItemModel->index(index, 0);
_listView->setCurrentIndex(modelIndex);
setText(modelIndex.data().toString());
}

void CustomComBox::setCurrentText(QString str) {
int row = _ItemModel->rowCount();
for (int i = 0; i < row; i++)
{
QModelIndex modelIndex = _ItemModel->index(i, 0);
if (modelIndex.data().toString() == str) {
setText(str);
_listView->setCurrentIndex(modelIndex);
}

}
}

void CustomComBox::clear() {
_ItemModel->clear();
this->setText("");
}

//尺寸自适应
void CustomComBox::resizeEvent(QResizeEvent *event)
{

int height, width;
width = this->width();
height = this->height();
_listView->setFixedWidth(width);
QString style;
if (_index == 0)
{
style = QString(
"CustomComBox{padding-left:5px;text-align:left;background-color:#ECF5FF;font-size:14px;border:1px solid #CCCCCC;color:#409EFF;font-family:Microsoft YaHei;border-radius: 3px;}"
"CustomComBox:menu-indicator{image:url(" UI_DROP_DOWN_ICONB ");width:20px;height:%2;}"
"QListView:item:selected{background-color:#cbe6ff;color:#409EFF;}"
"QListView:item:hover{background-color:#cbe6ff;color:#409EFF;}"
"QListView{background-color:#ECF5FF;color:#409EFF;}"
"QAbstractItemView{outline:0px;}"//选中日期样式,去掉虚线框
"QMenu{border:none;}").arg(height - 2);
}


else if(_index == 1)
{
style = QString(
"CustomComBox{padding-left:5px;text-align:left;border:1px solid #CCCCCC;font-size:14px;background-color:#ffffff;border-radius: 3px;font-family:Microsoft YaHei;}"
"CustomComBox:menu-indicator{image:url(" UI_IMAGE_QCOMBOBOX_DROP_DOWN ");width:20px;height:%2;}"
"QListView:item:selected{background-color:#cbe6ff;color:black;}"
//"QListView:item:hover{background-color:#cbe6ff;color:black;}"
"QListView{background-color:#ffffff;}"
"QAbstractItemView{outline:0px;}"//选中日期样式,去掉虚线框
"QMenu{border:none;}").arg(height - 2);
}

setStyleSheet(style);//更新样式,主要右边箭头位置
}

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

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

相关文章

读论文-基于序列模式的电子商务推荐系统综述(A Survey of Sequential Pattern Based E-Commerce Recommendation Systems)

前言 今天读的论文为一篇于2023年10月3日发表在《算法》(Algorithms)的论文,这篇文章综述了基于序列模式的电子商务推荐系统,强调了通过整合用户购买和点击行为的序列模式来提高推荐准确性、减少数据稀疏性、增加推荐新颖性,并改善推荐系统的可扩展性。文章详细分析了现有推…

提升办公质量,开源可视化表单助力梦想成真!

开源可视化表单操作简单、灵活简便、易维护,是通信业、电力、高校等众多行业实现流程化办公的理想表单。想要实现高质量的办公目的,可以借助低代码技术平台的力量梦想成真。开源可视化表单操作简单、灵活简便、易维护,是通信业、电力、高校等众多行业实现流程化办公的理想表…

袋鼠云产品功能更新报告09期|更全面,更多样,更高效

欢迎阅读袋鼠云09期产品功能更新报告。在此期报告中,我们秉持创新与优化并重的理念,对产品进行了深度打磨与全面升级。每一处细节的改进,都是我们对卓越品质的不懈追求,期待这些新功能能助力您的业务运营与发展,让数字化转型之路更加畅通无阻。 以下为袋鼠云产品功能更新报…

timeBeginPeriod 高精度定时器 Sleep

#include "timeapi.h" #pragma comment(lib, "winmm")// DWORD __stdcall ThreadTest(LPVOID pThreadParam) {CLog mLog;int i = 100;timeBeginPeriod(1);//1表示1ms精度while (i--){mLog.WriteLog("%d", i);Sleep(1000);}timeEndPeriod(1);retu…

SQLite 入门教程

不是 MySQL 用不起,而是 SQLite 更有性价比,绝大多数的 Web 应用 SQLite 都可以满足。不是 MySQL 用不起,而是 SQLite 更有性价比,绝大多数的 Web 应用 SQLite 都可以满足。SQLite 是一个用 C 语言编写的开源、轻量级、快速、独立且高可靠性的 SQL 数据库引擎,它提供了功能…

中百 NETAPP DS4243 存储故障盘换盘

netapp存储出现一个故障盘,现更换故障盘。图片是已更换后正常亮灯(实际故障盘是12)首先查看多控制器的磁盘状态A控磁盘状态B控磁盘状态等磁盘确定是FAILED后即可进行换盘拔出对应的故障盘更换新的新盘(更换时建议间隔半分钟)新盘更换后,在通过disk show -v查看磁盘属于No…

C++强制类型转换详解:四种操作符解析与实例演示

概述:C++中的强制类型转换是实现数据类型间转换的关键机制,包括static_cast、dynamic_cast、const_cast和reinterpret_cast四种。这些操作符适用于不同的场景,通过实例源代码详细阐述了它们的使用方法和步骤。 在C++中,强制类型转换是将一个数据类型的值转换为另一个数据类…

机器视觉:摄像机标定技术

机器视觉:摄像机标定技术 https://mp.weixin.qq.com/s/UGkYtGsGsgiiCzsaYlkx4g 空间物体表面某点的三维几何位置与其在图像中对应点之间的相互关系是由摄像机成像的几何模型决定的,这些几何模型参数就是摄像机参数,为了得到这些参数而进行的实验与计算的过程称为摄像机标定。…

代码随想录第三天 | 203.移除链表元素 707.设计链表 206.反转链表

LeetCode:203. 移除链表元素 - 力扣(LeetCode)思路:移除链表只是跳过需要移除的链表即可,即cur=cur.next 有关虚拟头结点:首先要建立一个结点作为虚拟头结点,也就是在head前加一个,然后因为虚拟头和一会要遍历的指针指向的内容不能变,所以用cur代替head,pre也就是虚拟…

时间回溯(物品)

展示思路 将作用物体的每帧信息存储在一个容器中,在时间回溯时逆序地读取容器中的信息; 步骤 1.创建以下项结构体:用于存储每帧信息; ActorComponent(下文使用AC代替):存放功能逻辑; 接口:用于角色调用AC; 回溯Actor:AC作用的Actor; 角色蓝图的操作逻辑:用于触发回…

飞剑

思路 创建单独的飞剑Actor,并在其中编写飞剑本身行为的脚本,然后在玩家角色蓝图中编写发射行为的脚本 效果展示步骤详述 1.角色蓝图中添加Spline组件2.创建飞剑的Actor3.角色蓝图中添加发射技能的脚本Tips:简单的材质修改

一道图的题

最近遇到的一道算法题: 有一个坐标系,输入一组数据input:, eg: const input = [[0, 0],[1, 1],[3, 1],[1, 2],[3, 2],[2, 3],[1, 4],[2, 4],[4, 4],[4, 5],[3, 4] ];input的每个值(数组)是一组坐标,对应到图是这样的,输出为: output: [[[0, 0]],[[1,1], [1,2]],[[3,1], [3…

P4983 忘情 题解

题目链接:忘情 大概是本题为数不多的李超树解法,凸包显然太经典,不再赘述。 先考虑简化原式,看看一个区间段的 \(val\) 这一大坨简化后是啥: \[\dfrac{((\sum_{i=1}^{n}x_i\times \overline{x})+\overline{x})^2}{\overline{x}^2},观察到分母有个\ \overline{x}^2,我们分子…

Lua学习笔记

Lua学习笔记 lua的基本语法和数据类型在Lua中,最重要的线程是协同程序(coroutine)它跟线程(thread)差不多,拥有自己独立的栈、局部变量和指令指针,可以跟其它协同程序共享全局变量和其它大部分东西。 线程和协程的区别:线程可以同时运行多个,而协程任意时刻只能运行一…

【HFSS】仿真显示方向图E面和H面

1. 建立远端辐射场2. 设置远端辐射方向图对于我仿真的天线模型,E面是phi=0,theta:0-360,H面是phi=90,theta:0-360; 配置内容E面方向图H面方向图但是当H面和E面在一个坐标里H面的方向图不同,原因是scale坐标不相同解决办法,扩大H面的scale的值

Unity如何从0实现技能CD遮罩

需求描述我们需要实现一个类似英雄联盟中的技能CD遮罩,施放技能后,技能遮罩占满技能图标,随着时间推移,技能遮罩顺时针减少遮挡面积,CD结束时,遮罩应完全消失。 需求分析 由于每个时刻,都会有一条线从中心点射向上面那条边的中点,我们自然可以想到将遮罩面片分为8个三角…

Dr4g0nB4ll - Vulnhub靶机

Dr4g0nB4ll - Vulnhub靶机 主机发现 192.168.30.133信息收集 └─$ nmap -sV -A 192.168.30.133 Starting Nmap 7.94 ( https://nmap.org ) at 2024-02-22 03:26 EST Nmap scan report for 192.168.30.133 Host is up (0.0013s latency). Not shown: 998 closed tcp ports (con…

[LitCTF 2023]导弹迷踪

查看源代码,下滑到最下面,看到很多.js文件

3分钟看懂设计模式01:策略模式

一、什么是策略模式 定义一些列算法类,将每一个算法封装起来,并让它们可以互相替换。 策略模式让算法独立于使用它的客户而变化,是一种对象行为型模式。 以上是策略模式的一般定义,属于是课本内容。 在没有真正理解策略模式之前并不需要对此定义下过多功夫,读一遍直接进入…

day39 动态规划part2 代码随想录算法训练营 62. 不同路径

day39 动态规划part2 代码随想录算法训练营 62. 不同路径题目:62. 不同路径 我的感悟:加油!武汉下冻雨是真冷呀!!理解难点:dp的含义, dp这里加的含义 dp外层是m,是深度,内层是n是长度 从1开始遍历,而不是从0.听课笔记:代码示例: class Solution:def uniquePaths(se…
推荐文章