Qt自定义Combobox实现列表上拉展示
2017-06-09 21:01
411 查看
废话
由于最近项目需要,想用一个能够上拉的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-QML-ComboBox-自定义,实现状态表示,内容可以动态正价,使用ListModel
- salesforce中实现点击编辑按钮,在inputField上展示已保存的记录值而非清空值&自定义展示Approval History相关列表
- C++ GUI Programming with Qt 4 - 10.3 实现自定义模型
- C++ GUI Programming with Qt 4 - 10.3 实现自定义模型
- 信息管理系统开发架构 配置实现列表展示分析图形及编辑等 构建信息分析展示平台 C#快速开发架构
- 实现产品列表的友好展示
- 利用CSS背景定位实现列表项目符号图像的精确定位(ul,li,自定义项目符号)
- 可输入可联想的下拉列表的实现——Ext ComboBox
- iphone利用线程实现数据的加载,并展示在table列表中
- 使用EXT实现ComboBox多列下拉列表
- 可输入可联想的下拉列表的实现——Ext ComboBox
- 解决WinForm中ComboBox控件的“设置"DataSourse”属性后无法修改项集合”以及两个不相关联的ComboxBox控件实现数据列表显示不可实现的问题
- C++ GUI Programming with Qt 4 - 10.4 实现自定义代理(delegate)
- android自定义列表的实现
- C++ GUI Programming with Qt 4 - 10.3 实现自定义模型
- iphone利用线程实现数据的加载,并展示在table列表中
- C++ GUI Programming with Qt 4 - 10.4 实现自定义代理(delegate)
- 如何实现ComboBox下拉列表显示图片
- 通过自定义字段类型实现SharePoint列表的父子关系
- Infopath自定义表单实现列表字段联动