您的位置:首页 > Web前端 > CSS

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

2015-10-10 14:39 561 查看
参考文章:
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>
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息