在开发的过程中,有个需求,是添加一个字体选择框,这个简单,我可以直接用了 QFontComboBox 解决,但是我的需求是字体不用系统字体,而是用我们自定义添加的字体库,后来我尝试用 QComboBox 解决,但是,这个鬼东西却不能单独改变单独 item 的字体样式,算了,直接自己写吧,话不多说,上代码:
class CFontComboBox : public QComboBox { Q_OBJECT private: QListWidget * mFontList; public: CFontComboBox(QWidget * parent = nullptr); void addFont(QString famil); void addFonts(QStringList famils); protected: void wheelEvent(QWheelEvent ) override; }; .cpp 文件 CFontComboBox::CFontComboBox(QWidgetparent) : QComboBox(parent) { mFOntList= new QListWidget(this); setModel(mFontList->model()); setView(mFontList); mFontList->setVerticalScrollBarPolicy(Qt::ScrollBarAsNeeded); setStyleSheet("QComboBox{combobox-popup:0;}"); setMaxVisibleItems(5); } void CFontComboBox::wheelEvent(QWheelEvent * event) { } void CFontComboBox::addFont(QString famil) { auto item = new QListWidgetItem(famil); QFont font; font.setFamily(famil); item->setFont(font); QIcon icon(":icons/T.png"); item->setIcon(icon); mFontList->addItem(item); } void CFontComboBox::addFonts(QStringList famils) { for (auto famil : famils) { addFont(famil); } }
大功告成,话不多说,上图:
自定义的是没有前面是没有那个图标的,这是我让 UI 给我设计的,想要的可以拿去用,话不多说,上图:
为了防止有人看不懂,我还是解释一下吧,看懂的直接跳过, setView(),是把我们的 View 替换上去,然后我们在对我们的 View 进行操作,
setStyleSheet(“QComboBox{combobox-popup:0;}”); setMaxVisibleItems(5);
这三句是为了设置滚动条和最大显示个数,不需要的可以不用设置 我这里重写了 wheelEvent 方法,是为了我不想不让用户通过鼠标去改变字体,不需要的可以不重写, 最后 addFont 和 addFonts 不用解释了吧,直接用这两个方法去添加字体都行了 如果感觉我的实例可以帮助到你,记得关注,以后会经常更新 Qt 技巧和方法 话不多说,下课
![]() | 1 QBugHunter 2020-12-22 19:18:17 +08:00 ![]() 谁告诉你 QComboBox 不能单独改变下拉菜单样式表的? QComboBox QAbstractItemView::item{min-height:20px} |
![]() | 2 QBugHunter 2020-12-22 19:24:38 +08:00 QComboBox 的下拉菜单(辅助控制器)叫 QAbstractItemView  |
![]() | 3 ysc3839 2020-12-22 20:00:34 +08:00 via Android 这个图标加了跟没加一样,因为都是一样的,加了对用户使用没有帮助。 要是选择图标的列表,加个图标预览就比较好。 |