1. 程式人生 > >Qt自定義Combobox實現列表上拉展示

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