Qt自定義Combobox實現列表上拉展示
廢話
由於最近專案需要,想用一個能夠上拉的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實現列表上拉展示
廢話 由於最近專案需要,想用一個能夠上拉的Combobox,但是試了各種方法發現QCombobox並不能達到我需要的效果,所以決定自己寫一個。 方法 其實很簡單,combobox可認為是按鈕和一個列表組成,按鈕由QPushButton來實現,列表由QLi
OC 自定義tabBar實現tabBar上帶有圓形按鈕
1.建立繼承自UITabBar控制元件的類CustomTabBar,程式碼如下: #import "CustomTabBar.h" @interface CustomTabBar () @property (nonatomic, strong)UIButton *roundButton;
自定義ListView重新整理,上拉載入
XListView public class XListView extends ListView implements OnScrollListener { private float mLastY = -1; // save event y private Scroller
angularJS自定義過濾器篩選列表/下拉框
angularJS過濾器實現篩選列表/下拉框 專案中有時會有這樣的需求:用input輸入框實現對select下拉框或者一個列表的篩選功能。(這是作者寫的一個小demo,請忽略樣式) 篩選的結果: 那麼怎麼用angularJS簡單、便捷地實現這一功能
Android中自定義MultipartEntity實現檔案上傳以及使用Volley庫實現檔案上傳
最近在參加CSDN部落格之星,希望大家給投一票,謝謝啦~ 點這裡投我一票吧~前言在開發當中,我們常常需要實現檔案上傳,比較常見的就是圖片上傳,比如修改個頭像什麼的。但是這個功能在Android和iOS中都沒有預設的實現類,對於And
Android 自定義view:實現ListView下拉的視差特效
一、概述: 現在流型的APP如微信朋友圈,QQ空間,微博個人展示都有視差特效的影子。 如圖:下拉圖片會產生圖片拉昇的效果,放手後圖片有彈回到原處: 那我們如何實現呢? 1)重寫ListView控制元件: 2)重寫裡面的overScrollBy方法
微信小程式實現列表上拉載入,自動適應螢幕
1.檢視層wxml <view class="page__bd"> <!-- 列表渲染 --> <block wx:for="{{goodsList
[Qt]自定義表頭實現過濾功能
1. 寫在前面 過濾功能源自專案上互動優化使用者體驗,在表頭新增過濾符號實現過濾,替換以往在表格上方佔用一行過濾項進行過濾。 2. 過濾提示 過濾提示就是三態圖示(normal,hover,press)。這三種狀態的實現通過滑鼠移動事件和滑鼠點選事件來實現。具體實
自定義ScrollView 實現上拉下拉的回彈效果--並且子控件中有Viewpager的情況
是否 AS abs pri tar utils lda animation ted onInterceptTouchEvent就是對子控件中Viewpager的處理:左右滑動應該讓viewpager消費 1 public class MyScrollView ext
自定義ListView實現下拉重新整理和上拉載入
實現ListView的下拉重新整理和上拉載入,需要先新增headerView和footerView,通過在拖動的過程中,控制頭尾佈局的paddingTop實現。先把paddingTop設為負值,來隱藏header,在下拉的過程中,不斷改變headerView的p
自定義SwipeRefreshLayout實現上拉載入更多並自帶系統的下拉重新整理
/** * Created by lzy on 2017/6/6 0006. */ public class MySwipeRefreshLayout extends SwipeRefreshLayout{ private final TextView mFoo
Android中Spinner下拉列表(使用ArrayAdapter和自定義Adapter實現)
今天學習了Spinner元件,使用Spinner相當於從下拉列表中選擇專案,下面演示一下Spinner的使用(分別使用ArrayAdapter和自定義Adapter實現) (一):使用Arr
自定義RecyclerView實現下拉重新整理和上拉載入
2)尾部佈局(上拉載入部分):refresh_recyclerview_footer.xml<span style="font-size:14px;"><?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:andro
自定義RecyclerView實現下拉重新整理和上拉載入(第一種實現方式)
說明:該自定義RecyclerView只適用於layoutManager為LinearLayoutManager的情況,使用的還是RecyclerView.Adapter。效果圖使用1、編寫layout檔案<?xml version="1.0" encoding="ut
QT 自定義混合控制元件——基於View/Model/Delegate的QTableView/QTreewidget/Combobox實現
QT自定義控制元件,檢視本文章需要具備一定的View/Model基礎知識(沒有也可以看)。本文實現了在一個QTreeWidget中插入一個QTableView,然後再在QTableView的每一個item中插入一個QCombobox,當然知道了方法你可以在任意item中插入任
自定義SwipeRefreshLayout實現上拉載入,下拉重新整理
原來的Android SDK中並沒有下拉重新整理元件,但是這個元件確實絕大多數APP必備的一個部件。好在google在v4包中出了一個SwipeRefreshLayout,但是這個元件只支援下拉重新整理,不支援上拉載入更多的操作。因此,我們就來簡單的擴充套件一下這個元件以實現上拉下載的目的。 基本原理 上
NPOI+反射+自定義特性實現上傳excel轉List及驗證
type set custom pre script private property xssf don 1.自定義特性 [AttributeUsage(AttributeTargets.Property, AllowMultiple = false, Inherited
Android bc信用盤搭建自定義behavior 實現上滑 隱藏底部view
退出 Y軸 log rect app sum string dsl oss 布局 <android.support.design.widget.CoordinatorLayout android:layout_width="match_parent"
Android UI 自定義ListView 實現下拉重新整理 載入更多
分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!  
使用vue自定義元件實現樹形列表
最近公司做新專案用的是vue,有一個功能做一個樹形列表由於之前一直用的是jquery操作dom,剛接觸vue走了不少彎路,特意寫部落格記錄一下 一、js自定義一個元件 <script type="text/template" id