废话

由于最近项目需要,想用一个能够上拉的Combobox,但是试了各种方法发现QCombobox并不能达到我需要的效果,所以决定自己写一个。

方法

其实很简单,combobox可认为是按钮和一个列表组成,按钮由QPushButton来实现,列表由QListView代替。

先来看看效果

![这里写图片描述](https://img-blog.csdn.net/20170609204717828?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvdTAxMDY1NTI4OA==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)

代码

.h文件
#ifndef PUSHCOMBOX_H
#define PUSHCOMBOX_H
#include <QPushButton>
#include <QWidget>
#include <QListView>
#include <qstringlistmodel.h>
#include <QModelIndex>
class pushcombox : public QPushButton
{Q_OBJECT
public:pushcombox(QWidget *widget=0);Q_PROPERTY(int currentIndex READ currentIndex WRITE setCurrentIndex NOTIFY currentIndexChanged)Q_PROPERTY(QString currentText READ currentText WRITE setCurrentText NOTIFY currentTextChanged)void addtextItem(QString );void addtextItems(QStringList);int currentIndex(){return  m_currindex;}QString currentText(){return m_currenttext;}void setCurrentIndex(int i);void setCurrentText(QString  str);
signals:void    activated(int index);void    activated(const QString & text);void    currentIndexChanged(int index);void    currentTextChanged(const QString text);
public slots:void    on_clicked();void    on_showPopup();
private:QListView *listview;QStringListModel *model;int m_currindex;QString m_currenttext;QWidget *widt;int parentwith;int parentheight;
};#endif // PUSHCOMBOX_H
.cpp文件
#include "pushcombox.h"
#include <QVBoxLayout>
#include <QDebug>
#include <QDesktopWidget>
pushcombox::pushcombox(QWidget *widget) : QPushButton(widget)
{m_currindex=0;m_currenttext="";widt=new QWidget(widget);listview=new QListView;QVBoxLayout *layout=new QVBoxLayout;layout->addWidget(listview);layout->setContentsMargins(0,0,0,0);widt->setLayout(layout);model=new QStringListModel;listview->setModel(model);listview->setEditTriggers(QAbstractItemView::NoEditTriggers);widt->hide();connect(listview,SIGNAL(clicked(QModelIndex)),SLOT(on_clicked()));connect(this,SIGNAL(clicked(bool)),this,SLOT(on_showPopup()));
}
void pushcombox::addtextItem(QString str)
{QStringList list;list=model->stringList();list+=str;model->setStringList(list);this->setText(list.at(m_currindex));
}
void pushcombox::on_clicked()
{QStringList list;list=model->stringList();this->setText(list.at(listview->currentIndex().row()));setCurrentIndex(listview->currentIndex().row());setCurrentText(list.at(listview->currentIndex().row()));widt->hide();
}
void pushcombox::on_showPopup()
{if(!widt->isHidden()){widt->hide();return;}int height=20*listview->model()->rowCount();if(height>window()->height()-this->y())height=this->y();widt->resize(this->width(),height);widt->move(this->x(),this->y()-height);widt->show();
}
void pushcombox::addtextItems(QStringList list)
{model->setStringList(list);this->setText(list.at(m_currindex));
}
void pushcombox::setCurrentIndex(int i)
{if(i==m_currindex)return;m_currindex=i;QStringList list;list=model->stringList();this->setText(list.at(m_currindex));emit currentIndexChanged(m_currindex);
}
void pushcombox::setCurrentText(QString str)
{if(str==m_currenttext)return;m_currenttext=str;emit currentTextChanged(m_currenttext);
}
测试
 pushcombox *com=new pushcombox(this);QStringList list;list<<"1"<<"2"<<"3"<<"4"<<"a"<<"b"<<"c"<<"d"<<"e"<<"f"<<"h";QStringListModel *model=new QStringListModel;model->setStringList(list);ui->listView->setModel(model);com->addtextItems(list);com->addtextItem("5");com->addtextItem("6");connect(com,SIGNAL(currentIndexChanged(int)),this,SLOT(on_mycombobx(int)));connect(com,SIGNAL(currentTextChanged(QString)),this,SLOT(on_mycombobx(QString)));

最后

关于上拉Combobox就这些,其他方向(下拉、侧拉),光标移动时候按钮上文字也跟随光标,控件失去焦点时关闭控件等等由于时间关系没有完善,在这先做个记录希望有时间了会来完成吧!

Qt自定义Combobox实现列表上拉展示相关推荐

  1. 自定义类在PropertyGrid上的展示方法

    自定义类在PropertyGrid上的展示方法 零.引言 PropertyGrid用来显示某一对象的属性,但是并不是所有的属性都能编辑,基本数据类型(int, double等)和.Net一些封装的类型 ...

  2. h5结合vant框架,实现列表上拉加载下拉刷新

    最近在做h5移动页面开发,并且需要用移动端android和ios将h5嵌进去.在开发过程中,使用了vant这个框架: vant文档:https://youzan.github.io/vant/#/zh ...

  3. android 列表上拉加载更多,Android 下拉刷新,上拉加载更多控件–支持ListView,GridView和ScrollView...

    麦洛遇到这样一个需求,实现类似于IOS下拉刷新,上拉加载更多的控件.麦洛google,baidu了一番,网上有不少实现,比较常见的是国外牛人的实现,不过国外的实现基本上都是扩展于ListView,所以 ...

  4. ios 平滑移动view_iOS 关于列表上拉(平滑加载数据)自动加载数据的问题

    项目需求 我的的列表需要改变,原来的分页加载采用的是MJRefresh框架进行加载更多数据,这需要有一个上拉动作才能触发,而我的产品的意思是当快要滑动到底部时自动加载下一页数据.我自己看了一下,发现很 ...

  5. (三) LtRecyclerView v2.x (自定义上拉和下拉刷新View)

    (一) 超简单自定义上下刷新布局-LtRecyclerView v2.x版本(基本使用) (二) LtRecyclerView v2.x (更多实用方法) (三) LtRecyclerView v2. ...

  6. 微信小程序之下拉刷新,上拉更多列表实现

    代码地址如下: http://www.demodashi.com/demo/11110.html 一.准备工作 首先需要下载小程序开发工具 官方下载地址: https://mp.weixin.qq.c ...

  7. React Native 实现FlatList的下拉刷新上拉加载

    RN对列表已经实现了下拉刷新与上拉加载的功能,但是为了更好用,做了封装. 实现的功能:     1.下拉刷新,使用原生下拉头.     2.上拉加载,自定义加载布局.     3.处理了重复刷新或重复 ...

  8. Qt自定义一个下拉框(使用基础组件组合)

    0.前言 Qt提供了一个QComboBox下拉框组件,但是对于一些自定义样式的需求实现起来并不方便,很多东西还得去倒腾源码,还不如直接用基础的组件自己来实现一个下拉框.不过,自己组合的组件对样式表的支 ...

  9. uni-app 小程序项目三 1. 商品列表、过滤器、封装商品item组件、上拉加载、节流阀、下拉刷新、2. 商品详情、轮播图、商品价格闪烁问题 3.加入购物车、vuex、持久化存储、mixiins

    1.0 创建 goodslist 分支 1.1 定义请求参数对象 为了方便发起请求获取商品列表的数据,我们要根据接口的要求,事先定义一个请求参数对象: data() {return {// 请求参数对 ...

  10. uniapp 自定义上拉加载下拉刷新组件

    介绍 该组件是结合uview框架写的,主要结合了里面的u-loadmore组件,可配置下拉刷新加载圈的颜色及背景色,暂无数据时的图等,突出的特点就是通过设置组件的高度,适配刘海屏iPhone,且支持嵌 ...

最新文章

  1. android之利用SQLite数据库实现登陆和注册
  2. 笔记本显示器仅计算机,将笔记本电脑(仅一个HDMI接口)连接到双屏幕(谨慎使用)的解决方案...
  3. python编程入门免费_python编程入门 零基础学习Python基础(附带最新免费教程)...
  4. Controller FioriTest.view.LineItem couldn't be instantiated
  5. C#DotNetBar TabControl将水平标签设置成竖直
  6. Rpc远程调用框架的设计与实现(2)
  7. 关于数据分析的4点心得:维度、指标、KPI
  8. poj_1442 Treap
  9. 【短时能量】基于matlab语音信号短时能量【含Matlab源码 1719期】
  10. python和java那个更难_python难还是java难
  11. app--查看包名的五种常用方法
  12. MathType安装教程,手把手教您
  13. C语言自学之路二(C语言数据类型)
  14. Android播放器框架分析之AwesomePlayer
  15. 笔记本电脑分屏操作指南
  16. 如何提高软件测试团队工作效率
  17. WordPress 网站基于REST API 开发“微信小程序”实战
  18. 董明珠与22岁的秘书孟羽童
  19. java 视频边下边播_video src,如何边加载边播放?
  20. 第 2 课:KNX智能控制系统的接口 BCU 模块

热门文章

  1. linux下命令行方式的音量控制
  2. 计算机1946考试试题,统考计算机考试试题及答案
  3. 集成 React Native 到现有Android项目
  4. JAVA作业——工资个税计算器
  5. 浅析凸优化理论学习中的“坑”
  6. 普渡大学计算机科学师生比,公立常春藤高校普渡大学,附申请要求+录取难度!...
  7. Java用Freemarker 生成word文档
  8. Ubuntu下ASIC/FPGA环境搭建
  9. 国内超强JS框架正在开源免费申请中
  10. 太阳系八大行星直径、质量、与太阳距离参数