QT 自定义Qcombobox样式,下拉项同时包括图片和文字

参考文章:

http://blog.sina.com.cn/s/blog_a6fb6cc90101ed6n.html

源码实现的是,在qt下自定义Qcombobox的下拉选项,每一个选项都可以单独拥有一个文字和实例图片,运行效果如下:

未展开时:




按下F1,然后按Enter展开后:



选项文字是QLabel,图片是QPushButton加载的背景图片

其中代码还涉及功能如下:

Enter展开后焦点自动指向对应选项,再次Enter隐藏下拉列表时,会把当前选项的文字的写入到combobox编辑框内

因为采用默认方向键,所以可上下移动选项焦点。


自定义qcombobox流程简述:

1 . 创建标准qcombobox:

    customComboBox = new QComboBox(this);   

2. combobox的model和view采用Qlistwidget 

<span style="font-size:18px;">list_widget = new QListWidget(this);</span>
<span style="font-size:18px;">customComboBox->setModel(list_widget->model());
customComboBox->setView(list_widget);</span>

<span style="font-size:18px;">
</span>

3. 向Qlistwidget内添加自定义的选项

<span style="font-size:18px;">QListWidgetItem *list_item = new QListWidgetItem(list_widget);
list_widget->setItemWidget(list_item, itemWidget);</span>

4. 其中自定义的选项(自定义的文字和图片)单独用对象表示

<span style="font-size:18px;">ItemWidget *itemWidget = new ItemWidget(this);</span>

下面贴出源码,其中鼠标操作等部分冗余,可略过。。。

有理解不到或错用滥用的部分欢迎留言指正。。。


<span style="font-size:18px;">#include "dialog.h"


int mouse_press = 0;
QComboBox *customComboBox;
QListWidget* list_widget;
ItemWidget::ItemWidget(QWidget *parent)
: QMainWindow(parent)
{
 mouse_press = false;
 label = new QLabel(this);
 image= new QPushButton(this);
 QWidget *widget = new QWidget(this);
 QHBoxLayout *main_layout = new QHBoxLayout(widget);


 main_layout->addWidget(label);
 main_layout->addStretch();
 main_layout->addWidget(image);
 main_layout->setContentsMargins(0, 0, 10, 10);
 main_layout->setSpacing(22);


}
dialog::dialog(QWidget *parent)
    : QDialog(parent)
{
    customComboBox = new QComboBox(this);
    list_widget = new QListWidget(this);
    customComboBox->setStyleSheet( "QComboBox QAbstractItemView::item{height:40px;width: 1px;} QComboBox{width: 100px}") ;//下拉选项高度
    customComboBox->setModel(list_widget->model());
    customComboBox->setView(list_widget);
    customComboBox->setEditable(true); //设置QComboBox可编辑


    customComboBox->view()->installEventFilter(this);
    customComboBox->installEventFilter(this);
    list_widget->installEventFilter(this);
}


void dialog::addItem(int row,QString text,QString imagePath)
{
    ItemWidget *itemWidget = new ItemWidget(this);
    itemWidget->label->setText(text);                           //设置字体
    QPixmap pixmap(imagePath);                                  //设置图像
    itemWidget->image->setIcon(pixmap);
    itemWidget->image->setIconSize(pixmap.size());
    itemWidget->image->setStyleSheet("background:transparent;");
    QListWidgetItem *list_item = new QListWidgetItem(list_widget);
    list_widget->setItemWidget(list_item, itemWidget);
}


void ItemWidget::mousePressEvent(QMouseEvent *event)
{
 if(event->button() == Qt::LeftButton)
 {
  mouse_press = true;
 }
}


void dialog::keyPressEvent(QKeyEvent *key)
{
    qDebug()<<"sss";


    if (key->key() == Qt::Key_Return)
    {
        qDebug()<<"sss";
    }
    if(key->key() == Qt::Key_F1)
    {
        addItem(0,"llll","delete.png");
    }
}


void ItemWidget::mouseReleaseEvent(QMouseEvent *event)
{
    int i = customComboBox->view()->currentIndex().row();
    qDebug()<<i;
     if(mouse_press)
     {
          customComboBox->setEditText( label->text());
          customComboBox->hidePopup();
          mouse_press = false;
     }
}


#define debug 1
bool dialog::eventFilter(QObject *obj, QEvent *event)
{
    if(event->type() == QEvent::ShortcutOverride)
    {
        switch (static_cast<QKeyEvent*>(event)->key())
        {
            case Qt::Key_Return:
                if(customComboBox->view()->isVisible())
                {
                    QListWidgetItem *item = list_widget->currentItem();
                    ItemWidget *account_item = (ItemWidget *)(list_widget->itemWidget(item));
                    QString text = account_item->label->text();
                    customComboBox->setEditText(text);
                    customComboBox->hidePopup();
                }
                else
                {
                    customComboBox->showPopup();
                    QString text1,text2;
                    text1 = customComboBox->currentText();
                    for(int i=0;i<3;i++)
                    {
                        QListWidgetItem *item = list_widget->item(i);
                        ItemWidget *account_item = (ItemWidget *)(list_widget->itemWidget(item));
                        text2 = account_item->label->text();
                        qDebug()<<text1<<text2;
                        if(text1 == text2)
                        {
                            list_widget->setCurrentRow(i);
                            break;
                        }
                    }
                }
                return true;
        }
    }
    else if(event->type() == QEvent::KeyPress)
    {
        QKeyEvent *keyEvent = static_cast<QKeyEvent*>(event);
        switch(keyEvent->key()){
        case Qt::Key_Return:
            return true;
        }
    }
    return QDialog::eventFilter(obj,event);
}


dialog::~dialog()
{


}</span>







猜你喜欢

转载自blog.csdn.net/a1028732302/article/details/49023083