V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
zoule
V2EX  ›  问与答

重写 QComboBox,实现自定义 QFontComboBox,可以添加自定义字体,显示字体样式

  •  
  •   zoule · 2020-12-22 19:13:51 +08:00 · 741 次点击
    这是一个创建于 1225 天前的主题,其中的信息可能已经有所发展或是发生改变。

    在开发的过程中,有个需求,是添加一个字体选择框,这个简单,我可以直接用了 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);
        }
    }
    

    大功告成,话不多说,上图: 选择字体.png

    自定义的是没有前面是没有那个图标的,这是我让 UI 给我设计的,想要的可以拿去用,话不多说,上图:

    图标.png

    为了防止有人看不懂,我还是解释一下吧,看懂的直接跳过, setView(),是把我们的 View 替换上去,然后我们在对我们的 View 进行操作,

    setStyleSheet(“QComboBox{combobox-popup:0;}”);
    setMaxVisibleItems(5);
    

    这三句是为了设置滚动条和最大显示个数,不需要的可以不用设置 我这里重写了 wheelEvent 方法,是为了我不想不让用户通过鼠标去改变字体,不需要的可以不重写, 最后 addFont 和 addFonts 不用解释了吧,直接用这两个方法去添加字体都行了 如果感觉我的实例可以帮助到你,记得关注,以后会经常更新 Qt 技巧和方法 话不多说,下课

    3 条回复    2020-12-22 20:00:34 +08:00
    QBugHunter
        1
    QBugHunter  
       2020-12-22 19:18:17 +08:00   ❤️ 1
    谁告诉你 QComboBox 不能单独改变下拉菜单样式表的?

    QComboBox QAbstractItemView::item{min-height:20px}
    QBugHunter
        2
    QBugHunter  
       2020-12-22 19:24:38 +08:00
    QComboBox 的下拉菜单(辅助控制器)叫 QAbstractItemView
    ![]( https://jxf2008-1302581379.cos.ap-nanjing.myqcloud.com/QtNotes/28-4.png)
    ysc3839
        3
    ysc3839  
       2020-12-22 20:00:34 +08:00 via Android
    这个图标加了跟没加一样,因为都是一样的,加了对用户使用没有帮助。
    要是选择图标的列表,加个图标预览就比较好。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   2309 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 29ms · UTC 09:52 · PVG 17:52 · LAX 02:52 · JFK 05:52
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.