QMenuBar的自绘处理和弹出位置控制

2020-05-17

www.qt-ui.com 原创技术文章

QMenu中没有提供菜单弹出方向的参数,所以需要我们自行计算菜单位置。

先通过addAction把需要的菜单项目全部添加好,然后调用sizeHine获取菜单大小。

然后在exec里面计算出最后显示的位置即可。

QMenu的自绘可以通过重载paintEvent来实现,通过actionGeometry来得到每一项的位置, 然后根据类型进行绘制。

 const QList<QAction*>& actions = pMenu->actions();
            for (int i = 0; i < actions.size(); ++i)
            {
                QAction* pAction = actions.at(i);
                QRect rect = pMenu->actionGeometry(pAction);

                if (i == _hotItemIdx && !pAction->isSeparator())
                {
                    drawFillStyle(*pPainter, _itemStyle[UIG_HOT], rect);
                    drawText(*pPainter, pAction->text(), _textStyle[UIG_HOT], rect);
                }
                else
                {
                    drawFillStyle(*pPainter, _itemStyle[UIG_NORMAL], rect);
                    drawText(*pPainter, pAction->text(), _textStyle[UIG_NORMAL], rect);
                }

                if (pAction->isSeparator())
                {
                    // draw seperator
                }
                else if (pAction->isCheckable())
                {
// draw check style
                }
                else
                {
                    // to do other type paint
                }

                if (pAction->menu())
                {
                    QBrush brush;
                    brush.setStyle(Qt::SolidPattern);
                    brush.setColor(0xffcccccc);

                    QPainterPath path;
                    path.moveTo(QPointF(rect.right() - 2, rect.top() + rect.height() / 2));
                    path.lineTo(QPointF(rect.right() - 2 - 5, rect.top() + rect.height() / 2 - 5));
                    path.lineTo(QPointF(rect.right() - 2 - 5, rect.top() + rect.height() / 2 + 5));
                    path.closeSubpath();

                    pPainter->fillPath(path, brush);
                }
            }

菜单文字中遇到&需要额外进行分割合理,将带有&的文字换成下划线字体文字进行绘制。 通过qt的QFontMetrics来计算文字长度。

QFont font;
        font.setPixelSize(textStyle._font.fontSize);
        font.setFamily(textStyle._font.fontFamily);
        font.setBold(textStyle._font.bold);
        font.setItalic(textStyle._font.italic);
        font.setUnderline(textStyle._font.underline);

        QString text = item.data(USER_CONTENT).toString();

        QStringList list = text.split("&");
        int height = 0;

        QFontMetrics fm(font);
        if (list.size() > 1)
        {
            for (size_t i = 0; i < list.size(); i++)
            {
                int totalWidth = fm.width(list.at(i));
            }
...
  }

Qt商用模板项目

支持C++/Python语言,支持Windows\Linux\MacOS系统,支持X86\ARM\MIPS架构

img02

Qt Stock Exchange Sys

View more

Qt股票交易系统

Qt Stock Exchange System

img02

Qt Robot

View more

QtRobot 视频高清机器人控制系统

Qt Robot System

img02

Qt LED Editor

View more

Qt LED 灯效编辑器

Qt LED Editor

img02

Qt IOT Bike

View more

Qt IOT 物联网自行车

Qt IOT Bike

img02

Qt ECG Monitor

View more

Qt嵌入式床旁心电监护仪

Qt ECG Monitor

img02

Qt AutoDashboard

View more

Qt汽车仪表盘系统

Qt Auto Dashboard

img02

Qt DataMonitor

View more

Qt数据监控系统

Qt Data Monitor

img02

Qt Conference

View more

Qt会议终端系统

Qt Conference System

img02

Qt Video Player

View more

Qt视频播放器

Qt Video Player

img02

Qt NetDisk

View more

Qt网盘系统

Qt SkyDrive

img02

Qt IM

View more

Qt即时通讯系统

Qt IM

img02

Qt Cashier

View more

Qt便利店收银系统

Qt CashierSystem

产品文档

0基础赋能高级Qt界面开发

author

使用视频教程

author

New Qt Designer使用文档

author

Qt控件库 API

author

模板项目文档



Copyright © 2018-2021 www.qt-ui.com
鄂ICP备20004169号