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
3. 向Qlistwidget内添加自定义的选项
4. 其中自定义的选项(自定义的文字和图片)单独用对象表示
下面贴出源码,其中鼠标操作等部分冗余,可略过。。。
有理解不到或错用滥用的部分欢迎留言指正。。。
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>
相关文章推荐
- QT学习 第一章:基本对话框
- 使用Shiboken为C++和Qt库创建Python绑定
- Qt定时器和随机数详解
- Qt实现图片移动实例(图文教程)
- Qt for Android开发实例教程
- QModelIndex/Role/Model介紹<二>
- 基于PyQt5的快速开发框架QFramer
- OSX下安装PyQt
- ok6410开发板移植DirectFB手记
- 【笔记】给Qt内嵌一个Chrome吧
- 【算法】最短路径之A*搜索
- qt入门必备
- 在 Qt4 中使用 C++11
- Hello Word ~ v0.2.2 背单词软件发布 -- By WHYPRO
- ubuntu下opencv和qt的安装配置
- linux下opengl的安装(with qt)
- qt 学习小节
- QT的命名风格
- QT 中的sleep
- QT 串口的监控