精华内容
下载资源
问答
  • Qt之实现下拉列表菜单

    万次阅读 2017-11-16 12:21:37
     在QGraphicsItem下使用QListWidget实现下拉列表的功能,并显示所有的选项,便于浏览和查询数据。 二、详解 1、部分代码 (1)clusterlistwidget.h [html] view plain copy ...

    一、简介

          在QGraphicsItem下使用QListWidget实现下拉列表的功能,并显示所有的选项,便于浏览和查询数据。

    二、详解

    1、部分代码

    (1)clusterlistwidget.h

    [html]  view plain  copy
    1. #ifndef CLUSTERLISTWIDGET_H  
    2. #define CLUSTERLISTWIDGET_H  
    3. #include <QWidget>  
    4. #include <QtGui>  
    5. #include "custombtn.h"  
    6. #include "pagenumbercontrol.h"  
    7. class SearchLineEdit;  
    8. enum TYPE{cluster=0,host,vm};  
    9. class ClusterListWidget : public QWidget  
    10. {  
    11.     Q_OBJECT  
    12. public:  
    13.     explicit ClusterListWidget(TYPE type = cluster,QWidget *parent = 0);  
    14.   
    15.     void setListWidget();  
    16.     void setTitle(QString title);  
    17.   
    18.     void listInit();  
    19. signals:  
    20.   
    21. public slots:  
    22.     void textChange(QString text);  
    23.     void pageChange(int currentnumber);  
    24.     void editClicked();  
    25.     void btnClicked();  
    26.     void itemEnteredSlot(QListWidgetItem * i);  
    27.     void itemClickedSlot(QListWidgetItem * i);  
    28.   
    29.     void rowChanged(int row);  
    30. protected:  
    31.     //bool eventFilter(QObject * obj, QEvent *e);  
    32.     void paintEvent(QPaintEvent *e);  
    33.     void showEvent(QShowEvent *e);  
    34.     void keyPressEvent(QKeyEvent *e);  
    35. private:  
    36.     void setImgs(const QString &normal,const QString &abnormal,const QString &error);  
    37.     void setVmImgs(const QString &linux_normal,const QString &linux_abnormal,const QString &linux_error,const QString &linux_off,  
    38.                    const QString &windows_normal,const QString &windows_abnormal,const QString &windows_error,const QString &windows_off);  
    39. private:  
    40.     //QString _icon;  
    41.     QPixmap backGroundPix;  
    42.     QStringList NameList;  
    43.     QStringList _searchList;  
    44.     QStringList _list;  
    45.     QLabel *lb1;  
    46.     QLabel *lb2;  
    47.     PageNumberControl *_page;  
    48.   
    49.     int _maxNum;  
    50.     int _currentNum;  
    51.     int _searchNUm;  
    52.     SearchLineEdit *_searchLineEdit;  
    53.     QListWidget * _cluster;  
    54.     QPushButton *_btn;  
    55.     int _n;//记录键盘 上下见  
    56.   
    57.     int _x;  
    58.     int _y;  
    59.     QPixmap _enterPixmap;  
    60.     bool _enter;  
    61.   
    62.     QString _title;  
    63.     QString _normal;  
    64.     QString _abnormal;  
    65.     QString __error;  
    66.   
    67.     TYPE _type;  
    68.   
    69.     QString _linux_normal;  
    70.     QString _linux_abnormal;  
    71.     QString _linux_error;  
    72.     QString _linux_off;  
    73.     QString _windows_normal;  
    74.     QString _windows_abnormal;  
    75.     QString _windows_error;  
    76.     QString _windows_off;  
    77. };  
    78. class SearchLineEdit : public QLineEdit  
    79. {  
    80.     Q_OBJECT  
    81.  public:  
    82.     explicit SearchLineEdit(QWidget *parent = 0);  
    83.  signals:  
    84.     void pressed();  
    85.  protected:  
    86.     void focusInEvent(QFocusEvent *e);  
    87.     void focusOutEvent(QFocusEvent *e);  
    88.  private:  
    89. };  
    90. #endif // CLUSTERLISTWIDGET_H  
    (2)clusterlistwidget.cpp
    [html]  view plain  copy
    1. #include "clusterlistwidget.h"  
    2.   
    3. ClusterListWidget::ClusterListWidget(TYPE type,QWidget *parent) :  
    4.     QWidget(parent,Qt::FramelessWindowHint)  
    5.   ,_maxNum(0)  
    6.   ,_searchNUm(0)  
    7.   ,_n(-1)  
    8.   ,_x(0)  
    9.   ,_y(0)  
    10.   ,_enter(false)  
    11. {  
    12.     NameList<<"a"<<"b"<<"c"<<"d"<<"e"<<"a"<<"b"<<"c"<<"d"<<"e"  
    13.              <<"a"<<"b"<<"c"<<"d"<<"e"<<"a"<<"b"<<"c"<<"d"<<"e"  
    14.                <<"a"<<"b"<<"c"<<"d"<<"e"<<"a"<<"b"<<"c"<<"d"<<"e"  
    15.                  <<"a"<<"b"<<"c"<<"d"<<"e"<<"a"<<"b"<<"c"<<"d"<<"e"<<"hjhjha";  
    16.     backGroundPix = QPixmap(":/images/handleMenu_bg.png");  
    17.     resize(backGroundPix.width(),  backGroundPix.height());  
    18.     qDebug()<<backGroundPix.width()<<backGroundPix.height();  
    19.     QPalette pal = palette();  
    20.     pal.setColor(QPalette::Background, QColor(0xFF,0xFF,0xFF,0x00));  
    21.     setPalette(pal);  
    22.     _listNameList;  
    23.     _type = type;  
    24.     lb1 = new QLabel(this);  
    25.     lb1->setPixmap(QPixmap(":/images/handleMenu_allClusters.png"));  
    26.     lb1->move(10,12);  
    27.   
    28.     lb2 = new QLabel(this);  
    29.     lb2->move(33,12);  
    30.     lb2->setStyleSheet("color:#b4e5fd");  
    31.   
    32.     _page = new PageNumberControl(this);  
    33.     _page->setCluster(true);  
    34.     _maxNum = (_list.count() - 1) / 16 +1;  
    35.     _currentNum = 1;  
    36.     _page->setTotalPage(_maxNum);  
    37.     _page->move(145,12);  
    38.   
    39.     _searchLineEdit = new SearchLineEdit(this);  
    40. //    _searchLineEdit->setImgs(":/images/handleMenu_searchInput.png",":/images/handleMenu_searchInput_click.png",  
    41. //                             ":/images/handleMenu_searchInput.png",":/images/handleMenu_searchInput.png");  
    42.     _searchLineEdit->setStyleSheet("background-image:url(:/images/handleMenu_searchInput.png);border:1px solid #536874;");  
    43.     _searchLineEdit->move(8,38);  
    44.     _searchLineEdit->resize(168,23);  
    45.     _searchLineEdit->installEventFilter(this);  
    46.     //_searchLineEdit->setFocusPolicy(Qt::NoFocus);  
    47.      _btn = new QPushButton(this);  
    48.      _btn->resize(14,14);  
    49.      _btn->move(155,41);  
    50.      _btn->setStyleSheet("QPushButton{background-color:transparent;border:0px;}");  
    51.      _btn->setFocusPolicy(Qt::NoFocus);  
    52.      _btn->setVisible(false);  
    53.   
    54.      connect(_btn,SIGNAL(clicked()),this,SLOT(btnClicked()));  
    55.      _cluster = new QListWidget(this);  
    56.     _cluster->show();  
    57.     setListWidget();  
    58.     _cluster->setMouseTracking(true);  
    59.     _cluster->setFocusPolicy(Qt::NoFocus);  
    60.     //_cluster->installEventFilter(this);  
    61.     connect(_searchLineEdit,SIGNAL(textChanged(QString)),this,SLOT(textChange(QString)));  
    62.     connect(_page,SIGNAL(currentPageChanged(int)),this,SLOT(pageChange(int)));  
    63.     connect(_searchLineEdit,SIGNAL(pressed()),this,SLOT(editClicked()));  
    64.     connect(_cluster,SIGNAL(itemEntered(QListWidgetItem*)),this,SLOT(itemEnteredSlot(QListWidgetItem*)));  
    65.     connect(_cluster,SIGNAL(itemClicked(QListWidgetItem*)),this,SLOT(itemClickedSlot(QListWidgetItem*)));  
    66.     connect(_cluster,SIGNAL(currentRowChanged(int)),this,SLOT(rowChanged(int)));  
    67.     //this->setFocus();  
    68.     //this->installEventFilter(this);  
    69. }  
    70.   
    71. void ClusterListWidget::setListWidget()  
    72. {  
    73.     _cluster->setStyleSheet("QListWidget{background-color:transparent;color:#19649F;border:0px solid gray;}"  
    74.                                           "QListWidget::item{background-color:transparent;border:0px solid gray;padding-left:28px;color:#b4e5fd}"  
    75.                                           //"QListWidget::item:!selected{border:0px solid gray;padding-left:28px;color:#b4e5fd}"  
    76.                                           //"QListWidget::item:selected:active{background-image:url(:/images/handleMenu_lixt_bg_selected.png);color:#b4e5fd;border-width:0;}"  
    77.                                           "QListWidget::item:selected{background-image:url(:/images/handleMenu_lixt_bg_selected.png);}"  
    78.                                           );  
    79.     _cluster->move(0,62);  
    80.     _cluster->resize(183,540);  
    81.     _cluster->clear();  
    82.   
    83.     pageChange(1);  
    84.   
    85. }  
    86.   
    87. void ClusterListWidget::setTitle(QString title)  
    88. {  
    89.     lb2->setText(title);  
    90. }  
    91.   
    92. void ClusterListWidget::setImgs(const QString &normal, const QString &abnormal, const QString &error)  
    93. {  
    94.     _normal = normal;  
    95.     _abnormal = abnormal;  
    96.     __error = error;  
    97. }  
    98.   
    99. void ClusterListWidget::setVmImgs(const QString &linux_normal,  
    100.                                   const QString &linux_abnormal,  
    101.                                   const QString &linux_error,  
    102.                                   const QString &linux_off,  
    103.                                   const QString &windows_normal,  
    104.                                   const QString &windows_abnormal,  
    105.                                   const QString &windows_error,  
    106.                                   const QString &windows_off)  
    107. {  
    108.     _linux_normal = linux_normal;  
    109.     _linux_abnormal = linux_abnormal;  
    110.     _linux_error = linux_error;  
    111.     _linux_off = linux_off;  
    112.     _windows_normal = windows_normal;  
    113.     _windows_abnormal = windows_abnormal;  
    114.     _windows_error = windows_error;  
    115.     _windows_off = windows_off;  
    116. }  
    117.   
    118.   
    119. void ClusterListWidget::editClicked()  
    120. {  
    121.     _searchLineEdit->setStyleSheet("background-image:url(:/images/handleMenu_searchInput_click.png);border:1px solid #536874;");  
    122.     _searchLineEdit->update();  
    123.     _btn->setVisible(true);  
    124. }  
    125.   
    126. void ClusterListWidget::btnClicked()  
    127. {  
    128.     _searchLineEdit->clear();  
    129.     _searchLineEdit->setStyleSheet("background-image:url(:/images/handleMenu_searchInput.png);border:1px solid #536874;");  
    130.     this->setFocus();  
    131. }  
    132.   
    133. void ClusterListWidget::itemEnteredSlot(QListWidgetItem *i)  
    134. {  
    135.     _n = _cluster->row(i);  
    136.     if(_n == _cluster->currentRow())  
    137.     {  
    138.         _enter = false;  
    139.     }else{  
    140.     _enter = true;}  
    141.     _x = 0;  
    142.     _y = _cluster->row(i)*33 +62;  
    143.     _enterPixmap = QPixmap(":/images/handleMenu_lixt_bg_hover.png");  
    144.   
    145.     _cluster->update();  
    146. }  
    147.   
    148. void ClusterListWidget::itemClickedSlot(QListWidgetItem *i)  
    149. {  
    150.     int row =_cluster->row(i);  
    151.     qDebug()<< (_currentNum -1)*16 + row;  
    152.     _enter = false;//选中跟悬停  只显示选中背景图片  
    153.     _cluster->update();  
    154.   
    155. }  
    156.   
    157. void ClusterListWidget::rowChanged(int row)  
    158. {  
    159.   
    160.     //qDebug()<< (_currentNum -1)*16 + row;  
    161.     _enter = false;//选中跟悬停  只显示选中背景图片  
    162.     _cluster->update();  
    163.     _n = row;  
    164. }  
    165.   
    166. //bool ClusterListWidget::eventFilter(QObject *obj, QEvent *e)  
    167. //{  
    168. //    if(obj == _cluster){  
    169. //        if(e->type() == QEvent::Leave)  
    170. //        {  
    171. //            _enter = false;  
    172. //            _cluster->update();  
    173. //            _n = _cluster->currentRow();  
    174. //            return true;  
    175. //        }  
    176. //    }  
    177. //   return false;  
    178. //    QWidget::eventFilter(obj,e);  
    179. //}  
    180.   
    181. void ClusterListWidget::textChange(QString text)  
    182. {  
    183.     _cluster->clear();  
    184.     _list.clear();  
    185.     _searchList.clear();  
    186.     for(int i = 0;i < NameList.count();i++){  
    187.         if(NameList.at(i).contains(text))  
    188.         {  
    189.             _searchList.append(NameList.at(i));  
    190.         }  
    191.     }  
    192.     _list = _searchList;  
    193.     _maxNum = (_list.count() - 1) / 16 +1;  
    194.     _currentNum = 1;  
    195.     _page->setTotalPage(_maxNum);  
    196.     pageChange(1);  
    197.     _cluster->update();  
    198.   
    199. }  
    200.   
    201. void ClusterListWidget::pageChange(int currentnumber)  
    202. {  
    203.   
    204.     _currentNum = currentnumber;  
    205.     _cluster->clear();  
    206.   
    207.     switch (_type) {  
    208.     case 0:  
    209.         setTitle(tr("all cluster"));  
    210.         setImgs(":/images/handleMenu_clusters.png",  
    211.                 ":/images/handleMenu_clusters_abnormal.png",":/images/handleMenu_clusters_error.png");  
    212.         if(_currentNum != _maxNum)  
    213.         {  
    214.             for(int i= (_currentNum -1) * 16;i <(_currentNum) * 16 ;i++ )  
    215.             {  
    216.                 QListWidgetItem *item = new QListWidgetItem;  
    217.                 item->setSizeHint(QSize(183,33));  
    218.                 item->setText(" "+_list.at(i));  
    219.                 item->setIcon(QIcon(_normal));  
    220.                 _cluster->addItem(item);  
    221.             }  
    222.         }else{  
    223.             for(int i = (_currentNum -1) * 16;i < _list.count();i++)  
    224.             {  
    225.                 QListWidgetItem *item = new QListWidgetItem;  
    226.                  item->setSizeHint(QSize(183,33));  
    227.                 item->setText(" "+_list.at(i));  
    228.                 item->setIcon(QIcon(__error));  
    229.                 _cluster->addItem(item);  
    230.             }  
    231.         }  
    232.         break;  
    233.     case 1:  
    234.   
    235.         setImgs(":/images/handleMenu_host.png",  
    236.                 ":/images/handleMenu_host_abnormal.png",":/images/handleMenu_host_error.png");  
    237.         if(_currentNum != _maxNum)  
    238.         {  
    239.             for(int i= (_currentNum -1) * 16;i <(_currentNum) * 16 ;i++ )  
    240.             {  
    241.                 QListWidgetItem *item = new QListWidgetItem;  
    242.                 item->setSizeHint(QSize(183,33));  
    243.                 item->setText(" "+_list.at(i));  
    244.                 item->setIcon(QIcon(_abnormal));  
    245.                 _cluster->addItem(item);  
    246.             }  
    247.         }else{  
    248.             for(int i = (_currentNum -1) * 16;i < _list.count();i++)  
    249.             {  
    250.                 QListWidgetItem *item = new QListWidgetItem;  
    251.                  item->setSizeHint(QSize(183,33));  
    252.                 item->setText(" "+_list.at(i));  
    253.                 item->setIcon(QIcon(__error));  
    254.                 _cluster->addItem(item);  
    255.             }  
    256.         }  
    257.         break;  
    258.     case 2:  
    259.         setVmImgs(":/images/handleMenu_vm.png",":/images/handleMenu_vm_linux_abnormal.png",":/images/handleMenu_vm_linux_error.png",  
    260.                   ":/images/handleMenu_vm_linux_shutdown.png",":/images/handleMenu_vm_windows.png",":/images/handleMenu_vm_windows_abnormal.png",  
    261.                   ":/images/handleMenu_vm_windows_error.png",":/images/handleMenu_vm_windows_shutdown.png");  
    262.         if(_currentNum != _maxNum)  
    263.         {  
    264.             for(int i= (_currentNum -1) * 16;i <(_currentNum) * 16 ;i++ )  
    265.             {  
    266.                 QListWidgetItem *item = new QListWidgetItem;  
    267.                 item->setSizeHint(QSize(183,33));  
    268.                 item->setText(" "+_list.at(i));  
    269.                 item->setIcon(QIcon(_linux_abnormal));  
    270.                 _cluster->addItem(item);  
    271.             }  
    272.         }else{  
    273.             for(int i = (_currentNum -1) * 16;i < _list.count();i++)  
    274.             {  
    275.                 QListWidgetItem *item = new QListWidgetItem;  
    276.                  item->setSizeHint(QSize(183,33));  
    277.                 item->setText(" "+_list.at(i));  
    278.                 item->setIcon(QIcon(_windows_error));  
    279.                 _cluster->addItem(item);  
    280.             }  
    281.         }  
    282.         break;  
    283.     default:  
    284.         break;  
    285.     }  
    286.   
    287.     _cluster->setCurrentRow(0);  
    288. }  
    289.   
    290. void ClusterListWidget::paintEvent(QPaintEvent *e)  
    291. {  
    292.     QPainter painter(this);  
    293.     painter.drawPixmap(0, 0, backGroundPix.width(), backGroundPix.height(), backGroundPix);  
    294.     if(_enter)  
    295.     {  
    296.         painter.drawPixmap(_x,_y,183,33,_enterPixmap);  
    297.     }  
    298.     //painter.setPen(QColor("#b4e5fd"));  
    299. }  
    300.   
    301. void ClusterListWidget::showEvent(QShowEvent *e)  
    302. {  
    303.     setListWidget();  
    304. }  
    305.   
    306. void ClusterListWidget::keyPressEvent(QKeyEvent *e)  
    307. {  
    308.     qDebug()<<"aaaaaaaaaaaaaaaaaaaaaa"<<_n;  
    309.     //n = _cluster->currentRow();  
    310.     if(e->key() == Qt::Key_Up)  
    311.     {  
    312.         if(_n > 0)  
    313.         {  
    314.             _n -1;  
    315.         }  
    316.         itemEnteredSlot(_cluster->item(_n));  
    317.         //_cluster->setCurrentRow(n);  
    318.         return;  
    319.     }  
    320.     if(e->key() == Qt::Key_Down)  
    321.     {  
    322.         if( _n < _cluster->count() -1){  
    323.             _n += 1;  
    324.         itemEnteredSlot(_cluster->item(_n));  
    325.         }  
    326.         //_cluster->setCurrentRow(n);  
    327.         return;  
    328.     }  
    329.     if(e->key() == Qt::Key_Enter || e->key() == Qt::Key_Return)  
    330.     {  
    331.         qDebug()<<"777777777777777";  
    332.         _cluster->setCurrentRow(_n);  
    333.         return;  
    334.     }  
    335.     QWidget::keyPressEvent(e);  
    336. }  
    337. SearchLineEdit::SearchLineEdit(QWidget *parent)  
    338.    :QLineEdit(parent)  
    339. {  
    340.   
    341. }  
    342.   
    343. void SearchLineEdit::focusInEvent(QFocusEvent *e)  
    344. {  
    345.     emit pressed();  
    346.   
    347.     QLineEdit::focusInEvent(e);  
    348.   
    349. }  
    350.   
    351. void SearchLineEdit::focusOutEvent(QFocusEvent *e)  
    352. {  
    353.     QLineEdit::focusInEvent(e);  
    354. }  
    (3)clusterlistitem.h
    [html]  view plain  copy
    1. #ifndef CLUSTERLISTITEM_H  
    2. #define CLUSTERLISTITEM_H  
    3.   
    4. #include <QGraphicsItem>  
    5. #include "graphicsitembutton.h"  
    6. #include "clusterlistwidget.h"  
    7. #include <QPalette>  
    8. #include <QtGui>  
    9. class clusterListItem : public QObject, public QGraphicsItem  
    10. {  
    11.     Q_OBJECT  
    12. public:  
    13.     explicit clusterListItem(QGraphicsItem *parent = 0);  
    14.     QRectF boundingRect() const;  
    15. signals:  
    16.   
    17. protected:  
    18.     void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget);  
    19.   
    20.     bool eventFilter(QObject *obj, QEvent *event);  
    21.   
    22. private slots:  
    23.     void slotBtnClicked();  
    24.   
    25. private:  
    26.     int _width;  
    27.     int _height;  
    28.     GraphicsItemButton * _listBtn;  
    29.     ClusterListWidget * _clusterWidget;  
    30.     QGraphicsProxyWidget *_proxy;  
    31.     bool _show;  
    32.     bool _focus;  
    33. };  
    34.   
    35. #endif // CLUSTERLISTITEM_H  
    (4) clusterlistitem.cpp
    [html]  view plain  copy
    1. #include "clusterlistitem.h"  
    2.   
    3. clusterListItem::clusterListItem(QGraphicsItem *parent) :  
    4.     QGraphicsItem(parent)  
    5.   ,_show(false)  
    6. {  
    7.     setFiltersChildEvents(true);  
    8.     //setAcceptedMouseButtons(Qt::LeftButton);  
    9.     //setAcceptHoverEvents(true);  
    10.     _width = 22;  
    11.     _height =21;  
    12.     _listBtn = new GraphicsItemButton(":/images/handleMenu_icon.png",  
    13.                                       ":/images/handleMenu_icon_hover.png",  
    14.                                       ":/images/handleMenu_icon_hover.png",  
    15.                                       "",  
    16.                                        GraphicsItemButton::normal,this);  
    17.   
    18.     _listBtn->setSize(22,21);  
    19.     _listBtn->setPos(0,0);  
    20.     _listBtn->installEventFilter(this);  
    21.     _clusterWidget = new ClusterListWidget(cluster);  
    22.     _proxy = new QGraphicsProxyWidget(this);  
    23.     _proxy->setWidget(_clusterWidget);  
    24.     _proxy->setPos(0,21);  
    25.     _proxy->setVisible(_show);  
    26.     _clusterWidget->installEventFilter(this);  
    27.     //this->installEventFilter(this);  
    28.     connect(_listBtn,SIGNAL(clicked()),this,SLOT(slotBtnClicked()));  
    29. }  
    30.   
    31. QRectF clusterListItem::boundingRect() const  
    32. {  
    33.     return QRectF(0, 0, _width, _height);  
    34. }  
    35.   
    36. void clusterListItem::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget)  
    37. {  
    38.       //painter->fillRect(QRectF(0, 0, _width, _height), QColor("#FF0000"));  
    39. }  
    40.   
    41. bool clusterListItem::eventFilter(QObject *obj, QEvent *event)  
    42. {  
    43.     if (event->type() == QEvent::FocusIn) {  
    44.         qDebug() << "QEvent::FocusIn---" << obj;  
    45.     }  
    46.     if (event->type() == QEvent::FocusOut) {  
    47.         qDebug() << "QEvent::FocusOut---" << obj;  
    48.     }  
    49.     if (event->type() == QEvent::MouseButtonPress) {  
    50.         qDebug() << obj;  
    51.         if (obj == _clusterWidget) {  
    52.             return true;  
    53.         }  
    54.         else {  
    55.             if (_show == true) {  
    56.                 _listBtn->setCurrent(false);  
    57.                 _show = false;  
    58.                 //_clusterWidget->hide();  
    59.                 QPropertyAnimation *animation = new QPropertyAnimation(_clusterWidget, "geometry");  
    60.                 animation->setDuration(300);  
    61.                 animation->setStartValue(QRect(0,21,183,602));  
    62.                 animation->setEndValue(QRect(0,21,183,0));  
    63.                 animation->start();  
    64.             }  
    65.         }  
    66.     }  
    67.      return QObject::eventFilter(obj, event);  
    68. }  
    69.   
    70. void clusterListItem::slotBtnClicked()  
    71. {  
    72.     this->setFocus();  
    73.     _listBtn->setCurrent(true);  
    74.     if(!_show){  
    75.         //_proxy->setVisible(!_show);  
    76.         _proxy->show();  
    77.         QPropertyAnimation *animation = new QPropertyAnimation(_clusterWidget, "geometry");  
    78.         animation->setDuration(300);  
    79.         animation->setStartValue(QRect(0,21,183,0));  
    80.         animation->setEndValue(QRect(0,21,183,602));  
    81.         animation->start();  
    82.         _show = true;  
    83.     }  
    84.     else{  
    85.   
    86.         QPropertyAnimation *animation = new QPropertyAnimation(_clusterWidget, "geometry");  
    87.         animation->setDuration(300);  
    88.         animation->setStartValue(QRect(0,21,183,602));  
    89.         animation->setEndValue(QRect(0,21,183,0));  
    90.         animation->start();  
    91.         _show = false;  
    92.     }  
    93. }  
    (5)main.cpp
    [html]  view plain  copy
    1. #include "clusterlistwidget.h"  
    2. #include <QApplication>  
    3. #include <QTextCodec>  
    4. #include <QtGui>  
    5. #include "clusterlistitem.h"  
    6. int main(int argc, char *argv[])  
    7. {  
    8.     QApplication a(argc, argv);  
    9.     QTextCodec::setCodecForTr(QTextCodec::codecForLocale());  
    10.   
    11.     QGraphicsView view;  
    12.     //view.resize(300,800);  
    13.   
    14.     QGraphicsScene scene;  
    15.   
    16.     scene.setSceneRect(-100, -300, 200, 600);  
    17.     view.setScene(&scene);  
    18.     view.setSceneRect(0, 0, 200, 600);  
    19.     //view.setCacheMode(QGraphicsView::CacheBackground);  
    20.     //view.setViewportUpdateMode(QGraphicsView::BoundingRectViewportUpdate);  
    21.     clusterListItem *item = new clusterListItem;  
    22.     scene.addItem(item);  
    23.     item->setPos(0, 0);  
    24.     view.resize(314, 814);  
    25.     view.show();  
    26.     view.installEventFilter(item);  
    27.     return a.exec();  
    28. }  

    三、总结

    (1)可以在eventFilter的QEvent::FocusIn和QEvent::FocusOut增加当鼠标移出菜单后自动回收的功能。其他的功能还需进一步完善。
    (2)原文链接:http://blog.csdn.net/taiyang1987912/article/details/51002420
    展开全文
  • 通过基本控件QPushButton,QWidget,实现下拉菜单,可以展开多级菜单
  • Qt浅谈之四十七下拉列表菜单

    千次阅读 2016-03-31 00:32:15
    在QGraphicsItem下使用QListWidget实现下拉列表的功能,并显示所有的选项,便于浏览和查询数据。 二、详解 1、部分代码 (1)clusterlistwidget.h #ifndef CLUSTERLISTWIDGET_H #define ...

    一、简介

     

          在QGraphicsItem下使用QListWidget实现下拉列表的功能,并显示所有的选项,便于浏览和查询数据。

     

     

     

    二、详解

    1、部分代码

     

    (1)clusterlistwidget.h

    #ifndef CLUSTERLISTWIDGET_H
    #define CLUSTERLISTWIDGET_H
    #include <QWidget>
    #include <QtGui>
    #include "custombtn.h"
    #include "pagenumbercontrol.h"
    class SearchLineEdit;
    enum TYPE{cluster=0,host,vm};
    class ClusterListWidget : public QWidget
    {
        Q_OBJECT
    public:
        explicit ClusterListWidget(TYPE type = cluster,QWidget *parent = 0);
    
        void setListWidget();
        void setTitle(QString title);
    
        void listInit();
    signals:
    
    public slots:
        void textChange(QString text);
        void pageChange(int currentnumber);
        void editClicked();
        void btnClicked();
        void itemEnteredSlot(QListWidgetItem * i);
        void itemClickedSlot(QListWidgetItem * i);
    
        void rowChanged(int row);
    protected:
        //bool eventFilter(QObject * obj, QEvent *e);
        void paintEvent(QPaintEvent *e);
        void showEvent(QShowEvent *e);
        void keyPressEvent(QKeyEvent *e);
    private:
        void setImgs(const QString &normal,const QString &abnormal,const QString &error);
        void setVmImgs(const QString &linux_normal,const QString &linux_abnormal,const QString &linux_error,const QString &linux_off,
                       const QString &windows_normal,const QString &windows_abnormal,const QString &windows_error,const QString &windows_off);
    private:
        //QString _icon;
        QPixmap backGroundPix;
        QStringList NameList;
        QStringList _searchList;
        QStringList _list;
        QLabel *lb1;
        QLabel *lb2;
        PageNumberControl *_page;
    
        int _maxNum;
        int _currentNum;
        int _searchNUm;
        SearchLineEdit *_searchLineEdit;
        QListWidget * _cluster;
        QPushButton *_btn;
        int _n;//记录键盘 上下见
    
        int _x;
        int _y;
        QPixmap _enterPixmap;
        bool _enter;
    
        QString _title;
        QString _normal;
        QString _abnormal;
        QString __error;
    
        TYPE _type;
    
        QString _linux_normal;
        QString _linux_abnormal;
        QString _linux_error;
        QString _linux_off;
        QString _windows_normal;
        QString _windows_abnormal;
        QString _windows_error;
        QString _windows_off;
    };
    class SearchLineEdit : public QLineEdit
    {
        Q_OBJECT
     public:
        explicit SearchLineEdit(QWidget *parent = 0);
     signals:
        void pressed();
     protected:
        void focusInEvent(QFocusEvent *e);
        void focusOutEvent(QFocusEvent *e);
     private:
    };
    #endif // CLUSTERLISTWIDGET_H
    

    (2)clusterlistwidget.cpp

    #include "clusterlistwidget.h"
    
    ClusterListWidget::ClusterListWidget(TYPE type,QWidget *parent) :
        QWidget(parent,Qt::FramelessWindowHint)
      ,_maxNum(0)
      ,_searchNUm(0)
      ,_n(-1)
      ,_x(0)
      ,_y(0)
      ,_enter(false)
    {
        NameList<<"a"<<"b"<<"c"<<"d"<<"e"<<"a"<<"b"<<"c"<<"d"<<"e"
                 <<"a"<<"b"<<"c"<<"d"<<"e"<<"a"<<"b"<<"c"<<"d"<<"e"
                   <<"a"<<"b"<<"c"<<"d"<<"e"<<"a"<<"b"<<"c"<<"d"<<"e"
                     <<"a"<<"b"<<"c"<<"d"<<"e"<<"a"<<"b"<<"c"<<"d"<<"e"<<"hjhjha";
        backGroundPix = QPixmap(":/images/handleMenu_bg.png");
        resize(backGroundPix.width(),  backGroundPix.height());
        qDebug()<<backGroundPix.width()<<backGroundPix.height();
        QPalette pal = palette();
        pal.setColor(QPalette::Background, QColor(0xFF,0xFF,0xFF,0x00));
        setPalette(pal);
        _list= NameList;
        _type = type;
        lb1 = new QLabel(this);
        lb1->setPixmap(QPixmap(":/images/handleMenu_allClusters.png"));
        lb1->move(10,12);
    
        lb2 = new QLabel(this);
        lb2->move(33,12);
        lb2->setStyleSheet("color:#b4e5fd");
    
        _page = new PageNumberControl(this);
        _page->setCluster(true);
        _maxNum = (_list.count() - 1) / 16 +1;
        _currentNum = 1;
        _page->setTotalPage(_maxNum);
        _page->move(145,12);
    
        _searchLineEdit = new SearchLineEdit(this);
    //    _searchLineEdit->setImgs(":/images/handleMenu_searchInput.png",":/images/handleMenu_searchInput_click.png",
    //                             ":/images/handleMenu_searchInput.png",":/images/handleMenu_searchInput.png");
        _searchLineEdit->setStyleSheet("background-image:url(:/images/handleMenu_searchInput.png);border:1px solid #536874;");
        _searchLineEdit->move(8,38);
        _searchLineEdit->resize(168,23);
        _searchLineEdit->installEventFilter(this);
        //_searchLineEdit->setFocusPolicy(Qt::NoFocus);
         _btn = new QPushButton(this);
         _btn->resize(14,14);
         _btn->move(155,41);
         _btn->setStyleSheet("QPushButton{background-color:transparent;border:0px;}");
         _btn->setFocusPolicy(Qt::NoFocus);
         _btn->setVisible(false);
    
         connect(_btn,SIGNAL(clicked()),this,SLOT(btnClicked()));
         _cluster = new QListWidget(this);
        _cluster->show();
        setListWidget();
        _cluster->setMouseTracking(true);
        _cluster->setFocusPolicy(Qt::NoFocus);
        //_cluster->installEventFilter(this);
        connect(_searchLineEdit,SIGNAL(textChanged(QString)),this,SLOT(textChange(QString)));
        connect(_page,SIGNAL(currentPageChanged(int)),this,SLOT(pageChange(int)));
        connect(_searchLineEdit,SIGNAL(pressed()),this,SLOT(editClicked()));
        connect(_cluster,SIGNAL(itemEntered(QListWidgetItem*)),this,SLOT(itemEnteredSlot(QListWidgetItem*)));
        connect(_cluster,SIGNAL(itemClicked(QListWidgetItem*)),this,SLOT(itemClickedSlot(QListWidgetItem*)));
        connect(_cluster,SIGNAL(currentRowChanged(int)),this,SLOT(rowChanged(int)));
        //this->setFocus();
        //this->installEventFilter(this);
    }
    
    void ClusterListWidget::setListWidget()
    {
        _cluster->setStyleSheet("QListWidget{background-color:transparent;color:#19649F;border:0px solid gray;}"
                                              "QListWidget::item{background-color:transparent;border:0px solid gray;padding-left:28px;color:#b4e5fd}"
                                              //"QListWidget::item:!selected{border:0px solid gray;padding-left:28px;color:#b4e5fd}"
                                              //"QListWidget::item:selected:active{background-image:url(:/images/handleMenu_lixt_bg_selected.png);color:#b4e5fd;border-width:0;}"
                                              "QListWidget::item:selected{background-image:url(:/images/handleMenu_lixt_bg_selected.png);}"
                                              );
        _cluster->move(0,62);
        _cluster->resize(183,540);
        _cluster->clear();
    
        pageChange(1);
    
    }
    
    void ClusterListWidget::setTitle(QString title)
    {
        lb2->setText(title);
    }
    
    void ClusterListWidget::setImgs(const QString &normal, const QString &abnormal, const QString &error)
    {
        _normal = normal;
        _abnormal = abnormal;
        __error = error;
    }
    
    void ClusterListWidget::setVmImgs(const QString &linux_normal,
                                      const QString &linux_abnormal,
                                      const QString &linux_error,
                                      const QString &linux_off,
                                      const QString &windows_normal,
                                      const QString &windows_abnormal,
                                      const QString &windows_error,
                                      const QString &windows_off)
    {
        _linux_normal = linux_normal;
        _linux_abnormal = linux_abnormal;
        _linux_error = linux_error;
        _linux_off = linux_off;
        _windows_normal = windows_normal;
        _windows_abnormal = windows_abnormal;
        _windows_error = windows_error;
        _windows_off = windows_off;
    }
    
    
    void ClusterListWidget::editClicked()
    {
        _searchLineEdit->setStyleSheet("background-image:url(:/images/handleMenu_searchInput_click.png);border:1px solid #536874;");
        _searchLineEdit->update();
        _btn->setVisible(true);
    }
    
    void ClusterListWidget::btnClicked()
    {
        _searchLineEdit->clear();
        _searchLineEdit->setStyleSheet("background-image:url(:/images/handleMenu_searchInput.png);border:1px solid #536874;");
        this->setFocus();
    }
    
    void ClusterListWidget::itemEnteredSlot(QListWidgetItem *i)
    {
        _n = _cluster->row(i);
        if(_n == _cluster->currentRow())
        {
            _enter = false;
        }else{
        _enter = true;}
        _x = 0;
        _y = _cluster->row(i)*33 +62;
        _enterPixmap = QPixmap(":/images/handleMenu_lixt_bg_hover.png");
    
        _cluster->update();
    }
    
    void ClusterListWidget::itemClickedSlot(QListWidgetItem *i)
    {
        int row =_cluster->row(i);
        qDebug()<< (_currentNum -1)*16 + row;
        _enter = false;//选中跟悬停  只显示选中背景图片
        _cluster->update();
    
    }
    
    void ClusterListWidget::rowChanged(int row)
    {
    
        //qDebug()<< (_currentNum -1)*16 + row;
        _enter = false;//选中跟悬停  只显示选中背景图片
        _cluster->update();
        _n = row;
    }
    
    //bool ClusterListWidget::eventFilter(QObject *obj, QEvent *e)
    //{
    //    if(obj == _cluster){
    //        if(e->type() == QEvent::Leave)
    //        {
    //            _enter = false;
    //            _cluster->update();
    //            _n = _cluster->currentRow();
    //            return true;
    //        }
    //    }
    //   return false;
    //    QWidget::eventFilter(obj,e);
    //}
    
    void ClusterListWidget::textChange(QString text)
    {
        _cluster->clear();
        _list.clear();
        _searchList.clear();
        for(int i = 0;i < NameList.count();i++){
            if(NameList.at(i).contains(text))
            {
                _searchList.append(NameList.at(i));
            }
        }
        _list = _searchList;
        _maxNum = (_list.count() - 1) / 16 +1;
        _currentNum = 1;
        _page->setTotalPage(_maxNum);
        pageChange(1);
        _cluster->update();
    
    }
    
    void ClusterListWidget::pageChange(int currentnumber)
    {
    
        _currentNum = currentnumber;
        _cluster->clear();
    
        switch (_type) {
        case 0:
            setTitle(tr("all cluster"));
            setImgs(":/images/handleMenu_clusters.png",
                    ":/images/handleMenu_clusters_abnormal.png",":/images/handleMenu_clusters_error.png");
            if(_currentNum != _maxNum)
            {
                for(int i= (_currentNum -1) * 16;i <(_currentNum) * 16 ;i++ )
                {
                    QListWidgetItem *item = new QListWidgetItem;
                    item->setSizeHint(QSize(183,33));
                    item->setText(" "+_list.at(i));
                    item->setIcon(QIcon(_normal));
                    _cluster->addItem(item);
                }
            }else{
                for(int i = (_currentNum -1) * 16;i < _list.count();i++)
                {
                    QListWidgetItem *item = new QListWidgetItem;
                     item->setSizeHint(QSize(183,33));
                    item->setText(" "+_list.at(i));
                    item->setIcon(QIcon(__error));
                    _cluster->addItem(item);
                }
            }
            break;
        case 1:
    
            setImgs(":/images/handleMenu_host.png",
                    ":/images/handleMenu_host_abnormal.png",":/images/handleMenu_host_error.png");
            if(_currentNum != _maxNum)
            {
                for(int i= (_currentNum -1) * 16;i <(_currentNum) * 16 ;i++ )
                {
                    QListWidgetItem *item = new QListWidgetItem;
                    item->setSizeHint(QSize(183,33));
                    item->setText(" "+_list.at(i));
                    item->setIcon(QIcon(_abnormal));
                    _cluster->addItem(item);
                }
            }else{
                for(int i = (_currentNum -1) * 16;i < _list.count();i++)
                {
                    QListWidgetItem *item = new QListWidgetItem;
                     item->setSizeHint(QSize(183,33));
                    item->setText(" "+_list.at(i));
                    item->setIcon(QIcon(__error));
                    _cluster->addItem(item);
                }
            }
            break;
        case 2:
            setVmImgs(":/images/handleMenu_vm.png",":/images/handleMenu_vm_linux_abnormal.png",":/images/handleMenu_vm_linux_error.png",
                      ":/images/handleMenu_vm_linux_shutdown.png",":/images/handleMenu_vm_windows.png",":/images/handleMenu_vm_windows_abnormal.png",
                      ":/images/handleMenu_vm_windows_error.png",":/images/handleMenu_vm_windows_shutdown.png");
            if(_currentNum != _maxNum)
            {
                for(int i= (_currentNum -1) * 16;i <(_currentNum) * 16 ;i++ )
                {
                    QListWidgetItem *item = new QListWidgetItem;
                    item->setSizeHint(QSize(183,33));
                    item->setText(" "+_list.at(i));
                    item->setIcon(QIcon(_linux_abnormal));
                    _cluster->addItem(item);
                }
            }else{
                for(int i = (_currentNum -1) * 16;i < _list.count();i++)
                {
                    QListWidgetItem *item = new QListWidgetItem;
                     item->setSizeHint(QSize(183,33));
                    item->setText(" "+_list.at(i));
                    item->setIcon(QIcon(_windows_error));
                    _cluster->addItem(item);
                }
            }
            break;
        default:
            break;
        }
    
        _cluster->setCurrentRow(0);
    }
    
    void ClusterListWidget::paintEvent(QPaintEvent *e)
    {
        QPainter painter(this);
        painter.drawPixmap(0, 0, backGroundPix.width(), backGroundPix.height(), backGroundPix);
        if(_enter)
        {
            painter.drawPixmap(_x,_y,183,33,_enterPixmap);
        }
        //painter.setPen(QColor("#b4e5fd"));
    }
    
    void ClusterListWidget::showEvent(QShowEvent *e)
    {
        setListWidget();
    }
    
    void ClusterListWidget::keyPressEvent(QKeyEvent *e)
    {
        qDebug()<<"aaaaaaaaaaaaaaaaaaaaaa"<<_n;
        //n = _cluster->currentRow();
        if(e->key() == Qt::Key_Up)
        {
            if(_n > 0)
            {
                _n -= 1;
            }
            itemEnteredSlot(_cluster->item(_n));
            //_cluster->setCurrentRow(n);
            return;
        }
        if(e->key() == Qt::Key_Down)
        {
            if( _n < _cluster->count() -1){
                _n += 1;
            itemEnteredSlot(_cluster->item(_n));
            }
            //_cluster->setCurrentRow(n);
            return;
        }
        if(e->key() == Qt::Key_Enter || e->key() == Qt::Key_Return)
        {
            qDebug()<<"777777777777777";
            _cluster->setCurrentRow(_n);
            return;
        }
        QWidget::keyPressEvent(e);
    }
    SearchLineEdit::SearchLineEdit(QWidget *parent)
       :QLineEdit(parent)
    {
    
    }
    
    void SearchLineEdit::focusInEvent(QFocusEvent *e)
    {
        emit pressed();
    
        QLineEdit::focusInEvent(e);
    
    }
    
    void SearchLineEdit::focusOutEvent(QFocusEvent *e)
    {
        QLineEdit::focusInEvent(e);
    }
    

    (3)clusterlistitem.h

    #ifndef CLUSTERLISTITEM_H
    #define CLUSTERLISTITEM_H
    
    #include <QGraphicsItem>
    #include "graphicsitembutton.h"
    #include "clusterlistwidget.h"
    #include <QPalette>
    #include <QtGui>
    class clusterListItem : public QObject, public QGraphicsItem
    {
        Q_OBJECT
    public:
        explicit clusterListItem(QGraphicsItem *parent = 0);
        QRectF boundingRect() const;
    signals:
    
    protected:
        void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget);
    
        bool eventFilter(QObject *obj, QEvent *event);
    
    private slots:
        void slotBtnClicked();
    
    private:
        int _width;
        int _height;
        GraphicsItemButton * _listBtn;
        ClusterListWidget * _clusterWidget;
        QGraphicsProxyWidget *_proxy;
        bool _show;
        bool _focus;
    };
    
    #endif // CLUSTERLISTITEM_H
    

    (4)clusterlistitem.cpp

    #include "clusterlistitem.h"
    
    clusterListItem::clusterListItem(QGraphicsItem *parent) :
        QGraphicsItem(parent)
      ,_show(false)
    {
        setFiltersChildEvents(true);
        //setAcceptedMouseButtons(Qt::LeftButton);
        //setAcceptHoverEvents(true);
        _width = 22;
        _height =21;
        _listBtn = new GraphicsItemButton(":/images/handleMenu_icon.png",
                                          ":/images/handleMenu_icon_hover.png",
                                          ":/images/handleMenu_icon_hover.png",
                                          "",
                                           GraphicsItemButton::normal,this);
    
        _listBtn->setSize(22,21);
        _listBtn->setPos(0,0);
        _listBtn->installEventFilter(this);
        _clusterWidget = new ClusterListWidget(cluster);
        _proxy = new QGraphicsProxyWidget(this);
        _proxy->setWidget(_clusterWidget);
        _proxy->setPos(0,21);
        _proxy->setVisible(_show);
        _clusterWidget->installEventFilter(this);
        //this->installEventFilter(this);
        connect(_listBtn,SIGNAL(clicked()),this,SLOT(slotBtnClicked()));
    }
    
    QRectF clusterListItem::boundingRect() const
    {
        return QRectF(0, 0, _width, _height);
    }
    
    void clusterListItem::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget)
    {
          //painter->fillRect(QRectF(0, 0, _width, _height), QColor("#FF0000"));
    }
    
    bool clusterListItem::eventFilter(QObject *obj, QEvent *event)
    {
        if (event->type() == QEvent::FocusIn) {
            qDebug() << "QEvent::FocusIn---" << obj;
        }
        if (event->type() == QEvent::FocusOut) {
            qDebug() << "QEvent::FocusOut---" << obj;
        }
        if (event->type() == QEvent::MouseButtonPress) {
            qDebug() << obj;
            if (obj == _clusterWidget) {
                return true;
            }
            else {
                if (_show == true) {
                    _listBtn->setCurrent(false);
                    _show = false;
                    //_clusterWidget->hide();
                    QPropertyAnimation *animation = new QPropertyAnimation(_clusterWidget, "geometry");
                    animation->setDuration(300);
                    animation->setStartValue(QRect(0,21,183,602));
                    animation->setEndValue(QRect(0,21,183,0));
                    animation->start();
                }
            }
        }
         return QObject::eventFilter(obj, event);
    }
    
    void clusterListItem::slotBtnClicked()
    {
        this->setFocus();
        _listBtn->setCurrent(true);
        if(!_show){
            //_proxy->setVisible(!_show);
            _proxy->show();
            QPropertyAnimation *animation = new QPropertyAnimation(_clusterWidget, "geometry");
            animation->setDuration(300);
            animation->setStartValue(QRect(0,21,183,0));
            animation->setEndValue(QRect(0,21,183,602));
            animation->start();
            _show = true;
        }
        else{
    
            QPropertyAnimation *animation = new QPropertyAnimation(_clusterWidget, "geometry");
            animation->setDuration(300);
            animation->setStartValue(QRect(0,21,183,602));
            animation->setEndValue(QRect(0,21,183,0));
            animation->start();
            _show = false;
        }
    }
    

    (5)main.cpp

    #include "clusterlistwidget.h"
    #include <QApplication>
    #include <QTextCodec>
    #include <QtGui>
    #include "clusterlistitem.h"
    int main(int argc, char *argv[])
    {
        QApplication a(argc, argv);
        QTextCodec::setCodecForTr(QTextCodec::codecForLocale());
    
        QGraphicsView view;
        //view.resize(300,800);
    
        QGraphicsScene scene;
    
        scene.setSceneRect(-100, -300, 200, 600);
        view.setScene(&scene);
        view.setSceneRect(0, 0, 200, 600);
        //view.setCacheMode(QGraphicsView::CacheBackground);
        //view.setViewportUpdateMode(QGraphicsView::BoundingRectViewportUpdate);
        clusterListItem *item = new clusterListItem;
        scene.addItem(item);
        item->setPos(0, 0);
        view.resize(314, 814);
        view.show();
        view.installEventFilter(item);
        return a.exec();
    }

     

    三、总结

    (1)可以在eventFilter的QEvent::FocusIn和QEvent::FocusOut增加当鼠标移出菜单后自动回收的功能。其他的功能还需进一步完善。
    (2)若有问题或建议,请留言,在此感谢!

    展开全文
  • 需要的控件:QpushButton,QWidget,QsScrollAreaDemo用的是Qt5.10,需要的自行下载。 http://download.csdn.net/download/figo_lyf001/10267449原理:QScrollArea做边框,QWidget做按钮背景界面,QVBoxLayout做垂直...

    需要的控件:QpushButton,QWidget,QsScrollArea

    Demo用的是Qt5.10,需要的自行下载。  http://download.csdn.net/download/figo_lyf001/10267449

    原理:QScrollArea做边框,QWidget做按钮背景界面,QVBoxLayout做垂直布局,用QPushButton做里面的父级按钮,QWidget做子级按钮界面,QPushButton做子级按钮,点击父按钮则子界面hide,再点则show。

    先看看效果,只做了基本的功能,没有美化,大家知道原理即可。



    首先布局*.ui


    下面上代码:

    代码比较简单,主要是控件在UI里面设计好了,代码解决点击事件的响应就好了


    展开全文
  • QT 创建下拉菜单

    2020-11-13 14:56:06
    给ToolButton创建一个下拉菜单,实现如图所示的效果。 //下拉菜单 QMenu *menuSelection = new QMenu(this); menuSelection->addAction(ui->actSelAll); menuSelection->addAction(ui->...

    给ToolButton创建一个下拉菜单,实现如图所示的效果。

    QToolButton的setMenu函数来实现下拉式菜单。

     

        //下拉菜单
        QMenu *menuSelection = new QMenu(this);
        menuSelection->addAction(ui->actSelAll);
        menuSelection->addAction(ui->actSelNone);
        menuSelection->addAction(ui->actSelInvs);
    
        //
        ui->tbtnSelItem->setPopupMode(QToolButton::MenuButtonPopup);
        ui->tbtnSelItem->setToolButtonStyle(Qt::ToolButtonTextBesideIcon);
        ui->tbtnSelItem->setDefaultAction(ui->actSelPopMenu);
        ui->tbtnSelItem->setMenu(menuSelection);
    

     

    展开全文
  • Qt CombBox下拉列表自定义(使用样式表),参考ReadMe.txt文档做适当的修改,更容易熟悉样式表使用,希望对你有用。
  • Qt自制像下拉列表那样点一下有东西出来点一下其他地方出来的东西就隐藏起来要怎么写,给我个大概思路
  • Qt5-下拉菜单子项居中

    2020-09-30 23:06:53
    Qt5-下拉菜单子项居中 //创建下拉菜单 QMenu* menuDVDCopy = new QMenu(this); //创建选择弹出式菜单 QWidgetAction* actDVDCopy0 = new QWidgetAction(this); QLabel *labDVDCopy0 = new QLabel(“dvd0->dvd1”)...
  • Qt自制像下拉列表那样点一下有东西出来点一下其他地方出来的东西就隐藏起来要怎么写,给我个大概思路
  • Qt:QComboBox下拉菜单

    2018-09-17 12:02:00
    1、新建QtGUI应用,基类选...
  • Qt中的QComboBox在不同平台下有所差异(主要是不可编辑的QComboBox),如下样式A和样式B: 左边为样式A为“fusion”样式...右边样式B为“windowsvista”样式,它是win10下Qt的默认样式,其特点是下拉列表会显示在文
  • QT界面 树形 列表菜单

    2019-06-11 20:20:24
    QT List树形列表界面,左边是菜单栏,右边是显示区域,
  • Qt QComboBox下拉列表做成圆角形式

    千次阅读 2018-04-19 18:18:05
    QComboBox *combobox = new QComboBox; combobox-&...setWindowFlags(Qt::Popup|Qt::FramelessWindowHint|Qt::NoDropShadowWindowHint); combobox-&gt;view()-&gt;window()-&gt;setAttrib...
  • Qt实现QQ好友下拉列表

    千次阅读 2013-08-24 20:31:12
    偶然发现Qt有个控件可以实现下拉列表,所以就试着实现一下类似QQ面板的下拉列表,这里主要实现几个功能:  1.可以删除列表中图标  2.可以像qq一样的,把某个分组下的图标转移到另外的分组  3.添加分组 代码里...
  • Qt之QComboBox下拉菜单

    2018-09-17 12:02:00
    2019独角兽企业重金招聘...1、新建QtGUI应用,基类选择widget,取消创建界面 2、widget.h widget.cpp     转载于:https://my.oschina.net/u/3919756/blog/2052295
  • QT控件QComboBox定制下拉列表为复选框的一个简单示例,在QT5.9环境下编译调试通过,可以参考此例子中的方法,进行定制修改。
  • QT comboBox设置下拉菜单()

    万次阅读 多人点赞 2018-09-29 11:50:19
    //Qt Creator 4.6.2 Based on Qt 5.11.1 (MSVC 2015, 32 bit)版本支持方法二(早些版本不支持的,具体从哪个版本开始支持,不太清楚) //通过设置当前文字来设置出事选中,值得注意的是,如果这个文字不在combobox...
  • Qt多级菜单

    2017-11-22 14:57:48
    结合使用QMenu和QAction提供的API实现了一个基于Qt的多级菜单demo,支持右键弹出菜单,稍加修改也同样适用于下拉菜单、按钮菜单等场合。
  • QT5.14入门教程GUI(八)第8个QT程序-下拉列表框-QComboBox 1、新建项目,改名称8ComboBox 2、改类名, 3、打开UI界面,双击;找到左侧,按钮;单击,拖到右侧界面中释放; 2个Combo Box 2个 Group Box 3 ...
  • Qt 之-下拉列表框QComboBox类

    千次阅读 2014-05-13 16:43:40
    QComboBox是QT GUI中的下拉列表框。 [cpp] view plaincopy class Q_GUI_EXPORT QComboBox : public QWidget  {   Q_OBJECT  常用方法和属性: (1)addItems void add...
  • QT的combobox下拉列表的宽度默认情况下与combobox本身的宽度是一致的,但是有时候下拉列表的文字很长,显示不开的时候,就需要我们手动设置其宽度, 原理是遍历每一项的长度,找到最大长度,然后使用setFixedWidth...
  • QT——如何向下拉列表框中添加选项

    千次阅读 2020-08-23 14:56:32
    获取ui中当前下拉列表框的对象名称,使用inserItem方法添加,如图1所示。 图12、在.ui中实现 在.ui文件中,双击你的QComboBox控件 选择“属性” 点击绿色的加号,添加文本即可 使用代码添加的...
  • QT中复合按钮中下拉菜单的实现

    万次阅读 2014-04-15 13:51:52
    QT 实现类似于Foxmail工具栏中的按钮,复合功能菜单按钮
  • QT菜单栏QMenu,下拉菜单QAction,工具栏QToolBar的使用(一),添加了菜单栏edit,help,以及edit,help的下拉菜单,还有添加了file工具栏,edit工具栏 菜单栏及下拉菜单与上一节使用一样, 创建菜单栏类:  ...
  • QT主窗体右键弹出下拉菜单方法(我的主窗体的类名是CGuiMainwindow): void CGuiMainwindow::contextMenuEvent(QContextMenuEvent* e) { QMenu *menu = new QMenu(); menu->addSeparator(); menu->addSeparator...
  • 在QTableView 中添加Combo控件,实现列表中的下拉选择控件,在Qt中Demo有了编辑框和spin的列表控件,我在demo中spin的工程中添加了combo,实现列表中的combo下拉选择控件,其他的控件也可以参考此方法开发,新加的为...
  • Qt下拉对话框 ComboBox的用法

    千次阅读 2019-03-30 10:45:34
    ComboBox是Qt下拉菜单的一个控件,通过下拉菜单选择不同的选项。 基本用法 m_ComBox = ui.comboBox; //设置默认显示值的索引,从0开始 m_ComBox->setCurrentIndex(1); //关联信号和槽 QObject::connect...
  • QComboBox的下拉列表默认情况下行距等于字高,显示效果看起来非常拥挤, 对于显示相关的问题,一般都能用样式表解决,但是QComboBox的下拉列表的行高就比较另类了 用样式表设置行高的qss语句如下: QComboBox ...
  • Qt 实现多级菜单

    千次阅读 2018-05-17 15:38:11
    原文地址::https://blog.csdn.net/heaven_evil/article/details/78601478前言在众多知名的软件UI中下拉菜单、...下图就是我们最常见的Windows系统多级菜单Qt实现(多级)菜单Qt中通过QMenu和QAction就可以实现这...
  • Qt颜色下拉框菜单

    千次阅读 2018-08-07 14:50:27
    Qt颜色下拉框菜单 头文件: #ifndef COLOR_MENU #define COLOR_MENU #include &amp;lt;QObject&amp;gt; #include &amp;lt;QMenu&amp;gt; #include &amp;lt;QAction&amp;gt; #include &...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 2,139
精华内容 855
关键字:

qt下拉列表菜单