首页 星云 工具 资源 星选 资讯 热门工具
:

PDF转图片 完全免费 小红书视频下载 无水印 抖音视频下载 无水印 数字星空

Qt自定义下拉列表-可为选项设置标题、可禁用选项

移动开发 4.23KB 48 需要积分: 1
立即下载

资源介绍:

项目开发中,很可能简单的QComboBox满足不了需求,就需要自定义QComboBox。本示例创建一个自定义的下拉列表,并为选项设置标题、可禁用选项
#include "CustomCombo.h" #include #include CustomCombo::CustomCombo(QWidget *parent) :QComboBox(parent), list_(nullptr) { list_ = new QListWidget; list_->setItemDelegate(new CustomComboDelegate(this)); setModel(list_->model()); setView(list_); } void CustomCombo::addTitle(const QString &text) { list_->addItem(new CustomComboTitle(this, text)); resetCurrentInd(); } void CustomCombo::addItem(const QString &text) { list_->addItem(new CustomComboItem(this, text)); resetCurrentInd(); } void CustomCombo::setIsTitle(int ind, bool b) { auto *item = dynamic_cast(list_->item(ind)); item->setIsTitle(b); resetCurrentInd(); } void CustomCombo::setSelectable(int ind, bool b) { auto *item = dynamic_cast(list_->item(ind)); item->setSelectable(b); resetCurrentInd(); } void CustomCombo::resetCurrentInd() { auto *item = static_cast(list()->item(currentIndex())); if (item->isSelectable()) return; for (int i = 0; i < count(); ++i) { auto *item = static_cast(list()->item(i)); if (item->isSelectable()) { setCurrentIndex(i); break; } } } //CustomComboItem //------------------------------------------------------------------------------------------------------------ CustomComboItem::CustomComboItem(CustomCombo *combo, const QString &str) : QListWidgetItem(str), combo_(combo), isTitle_(false), selectable_(true){ } void CustomComboItem::setIsTitle(bool b) { isTitle_ = b; if (isTitle_) setSelectable(false); } void CustomComboItem::setSelectable(bool selectable) { selectable_ = selectable; if (selectable_) setFlags(flags() | (Qt::ItemIsSelectable | Qt::ItemIsUserCheckable | Qt::ItemIsEnabled)); else setFlags(flags() & ~(Qt::ItemIsSelectable | Qt::ItemIsUserCheckable | Qt::ItemIsEnabled)); } //CustomComboDelegate //------------------------------------------------------------------------------------------------------------ CustomComboDelegate::CustomComboDelegate(CustomCombo *combo) :combo_(combo) { } void CustomComboDelegate::paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const { auto *item = static_cast(combo_->list()->item(index.row())); QStyleOptionMenuItem opt = getStyleOption(option, index, item); painter->fillRect(opt.rect, opt.palette.window()); combo_->style()->drawControl(QStyle::CE_MenuItem, &opt, painter, combo_); } QSize CustomComboDelegate::sizeHint(const QStyleOptionViewItem &option, const QModelIndex &index) const { auto *item = static_cast(combo_->list()->item(index.row())); QStyleOptionMenuItem opt = getStyleOption(option, index, item); return combo_->style()->sizeFromContents(QStyle::CT_MenuItem, &opt, option.rect.size(), combo_); } QStyleOptionMenuItem CustomComboDelegate::getStyleOption(const QStyleOptionViewItem &option, const QModelIndex &index, CustomComboItem *item) const { QStyleOptionMenuItem menuOption; QPalette resolvedpalette = option.palette.resolve(QApplication::palette("QMenu")); QBrush textBrush = resolvedpalette.brush(QPalette::Active, QPalette::Text); QVariant value = index.data(Qt::ForegroundRole); if (value.canConvert()) textBrush = qvariant_cast(value); if (! item->isSelectable()) textBrush = resolvedpalette.brush(QPalette::Disabled, QPalette::Text); if (item->isTitle()) textBrush = resolvedpalette.brush(QPalette::Active, QPalette::HighlightedText); resolvedpalette.setBrush(QPalette::WindowText, textBrush); resolvedpalette.setBrush(QPalette::ButtonText, textBrush); resolvedpalette.setBrush(QPalette::Text , textBrush); menuOption.palette = resolvedpalette; menuOption.state = QStyle::State_None; if (combo_->window()->isActiveWindow()) menuOption.state = QStyle::State_Active; if ((option.state & QStyle::State_Enabled) && (index.model()->flags(index) & Qt::ItemIsEnabled)) menuOption.state |= QStyle::State_Enabled; else menuOption.palette.setCurrentColorGroup(QPalette::Disabled); if (option.state & QStyle::State_Selected) menuOption.state |= QStyle::State_Selected; menuOption.checkType = QStyleOptionMenuItem::NonExclusive; menuOption.checked = (combo_->currentIndex() == index.row()); if (isSeparator(index)) menuOption.menuItemType = QStyleOptionMenuItem::Separator; else menuOption.menuItemType = QStyleOptionMenuItem::Normal; QBrush bgBrush = menuOption.palette.brush(QPalette::Window); if (index.data(Qt::BackgroundRole).canConvert()) bgBrush = qvariant_cast(index.data(Qt::BackgroundRole)); if (item->isTitle()) bgBrush = resolvedpalette.brush(QPalette::Active, QPalette::Highlight); menuOption.palette.setBrush(QPalette::All, QPalette::Window, bgBrush); menuOption.text = index.model()->data(index, Qt::DisplayRole).toString(); menuOption.tabWidth = 0; menuOption.maxIconWidth = option.decorationSize.width() + 4; menuOption.menuRect = option.rect; menuOption.rect = option.rect; menuOption.font = combo_->font(); menuOption.fontMetrics = QFontMetrics(menuOption.font); if (item->isTitle()) menuOption.font.setBold(true); return menuOption; }

资源文件列表:

CustomComboDemo.zip 大约有7个文件
  1. CustomComboDemo/
  2. CustomComboDemo/CustomCombo.cpp 5.48KB
  3. CustomComboDemo/CustomCombo.h 2.23KB
  4. CustomComboDemo/CustomComboDemo.pro 668B
  5. CustomComboDemo/main.cpp 172B
  6. CustomComboDemo/mainwindow.cpp 793B
  7. CustomComboDemo/mainwindow.h 217B
0评论
提交 加载更多评论
其他资源 汇川Eazy52X系列PLC固件升级包V6-3-0-0
名称:固件升级包 版本:V6.3.0.0 型号:Eazy52x系列PLC 品牌:汇川 汇川Eazy52x系列PLC的固件升级文件,包含两个文件,后缀为upgrade的是固件升级的文件,后缀为img的是固件烧录的文件。
idea中如何配置tomcat.10(新版)并运行一个项目
tomcat10 jdk17
windows网络调试kdnet
windows网络调试kdnet
audacity-win-2.3.0
Audacity中文版一款跨平台、免费开源的录音、编辑声音编辑器,让你轻松编辑音乐文件无负担,Audacity中文版提供了理想的音乐文件功能自带的声音效果包括回声,更改节拍,减少噪音,而Audacity内建的剪辑、复制、混音与特效功能,更可满足一般的编辑需求。
Javascript实现的微信小程序项目代码.zip
Javascript实现的微信小程序项目代码.zip
Javascript实现的微信小程序项目代码.zip Javascript实现的微信小程序项目代码.zip Javascript实现的微信小程序项目代码.zip
高校学籍管理系统 C/C++语言 visual Studio开发 课程设计
高校学籍管理系统 (1)能够输入学生信息并将其存入数据文件中。 (2)能将指定信息从文件中删除。 (3)能够按学号或姓名对学生的信息进行检索并将检索结果显示在屏幕上。 (4)统计学生总成绩及其在班上排名。 (5)统计各科的平均成绩及及格率。 (6)要求有错误提示功能,如性别只能输入男 女,输入错误提示重新输入。如果检索不到相应信息应提示用户。 (7)对班级学生成绩占比(每10分为一档如60-69占百分比)采用柱状图表示; (8)增加学生用户、教师和管理员用户。管理员用户可以完成学生信息的录入、查询、添加教师和学生用户等功能。学生用户仅只能看到自己的信息。教师可以录入、查询和修改成绩等。
mysq 5 和 8 两个版本的l驱动jar包
内含mysq 5 和 8 两个版本的l驱动jar包 注意:不同版本 jar包,加载驱动路径不同 使用mysql-connector-j-8.0.31驱动如下: Class.forName("com.mysql.cj.jdbc.Driver"); 使用mysql-connector-java-5.1.47加载驱动如下: Class.forName("com.mysql.jdbc.Driver");
LP-MSPM0G3507fft实现
LP-MSPM0G3507fft实现