Qt自定义圆形环状菜单

本文介绍如何使用Qt创建一个可自定义的圆形环状菜单,包括设置背景色、Hover效果、动画速度等。通过重写鼠标事件处理拖动、点击功能,以及绘制代码来实现环状菜单的显示和交互。此外,还提供了工程代码的下载链接供读者参考。
摘要由CSDN通过智能技术生成

Qt自定义圆形环状菜单

先看实现的效果
在这里插入图片描述

可设置圆环背景色、Hover扇形的颜色、箭头颜色、动画速度,核心代码如下

1、初始化设置背景透明,默认打开旋转和缩放动画

	q->setFixedSize(180, 180);
    diameter = 150;
    smallDiameter = calcInCircleRadius() * 2;
    q->setMouseTracking(true);

    q->setWindowFlags(Qt::FramelessWindowHint | Qt::Dialog);
    q->setAttribute(Qt::WA_TranslucentBackground);
    q->setRotateAnimationEnabled(true);
    q->setZoomAnimationEnabled(true);

2、重写鼠标事件,实现拖动,点击等功能

void CircleMenu::mousePressEvent(QMouseEvent *event)
{
    if(event->button() != Qt::LeftButton){
        return ;
    }
    Q_D(CircleMenu);
    d->pressed = true;
    d->startPos = event->pos();

    QPointF center(width() / 2.0, height() / 2.0);
    double distance = std::sqrt(std::pow(center.x() - d->startPos.x(), 2) + std::pow(center.y() - d->startPos.y(), 2));
    d->pressPosIsInSmallCircle = distance < d->calcInCircleRadius();
}
void CircleMenu::mouseMoveEvent(QMouseEvent *event)
{
    Q_D(CircleMenu);
    if(d->canMove && d->pressed && d->pressPosIsInSmallCircle){
        this->move(this->pos() + event->pos() - d->startPos);
        d->moved = true;
    }
    if(d->isMenuVisible){
        auto old = d->currentArea;
        d->currentArea = d->calcArea(event->pos());
        update();
        if(!d->pressed){
            d->updateTip(event->globalPos());
        }
        if(d->pressed && old != d->currentArea && !d->pressPosIsInSmallCircle){
            d->pressedMovedArea = d->currentArea;
            emit sigAreaChanged(d->currentArea);
        }
    }
}
void CircleMenu::mouseReleaseEvent(QMouseEvent *event)
{
    Q_D(CircleMenu);
    d->pressed = false;
    if(event->button() != Qt::LeftButton){
        return ;
    }
    if(d->isMenuVisible){
        auto old = d->pressedMovedArea;
        d->pressedMovedArea = d->calcArea(event->pos());
        if(old != d->pressedMovedArea){
            emit sigAreaChanged(d->pressedMovedArea);
        }
        emit sigClicked(d->pressedMovedArea);
    }
    if(!d->isPopup && !d->moved){
        QPoint rela = event->pos() - QPoint(width() / 2, height() / 2);
        int dis = std::sqrt(rela.x() * rela.x() + rela.y() * rela.y());
        if(dis > d->smallDiameter / 2){
            return ;
        }
        d->isMenuVisible = !d->isMenuVisible;
        d->aniGroup->setDirection(d->isMenuVisible ? QVariantAnimation::Forward : QVariantAnimation::Backward);
        d->aniGroup->start();
    }
    d->moved = false;
}

3、重写event事件,点击主界面空白区域关闭窗口

bool CircleMenu::event(QEvent *event)
{
    switch (event->type()) {
    case QEvent::FocusOut:
    case QEvent::WindowDeactivate:
        if(d_func()->isPopup){
            d_func()->hidePopup();
        }
        break;
    case QEvent::Leave:
        d_func()->currentArea = Unknown;
        update();
        break;
    default:
        break;
    }
    return QWidget::event(event);
}

4、最后是绘图代码

void CircleMenu::paintEvent(QPaintEvent *event)
{
    Q_UNUSED(event)
    Q_D(CircleMenu);
    QPainter painter(this);
    if(d->isPopup){
        painter.fillRect(rect(), QBrush(QColor(0, 0, 0, 1)));
    }

    painter.setRenderHints(QPainter::SmoothPixmapTransform | QPainter::Antialiasing);
    QPointF center(width() / 2.0, height() / 2.0);
    painter.translate(center);
    painter.rotate(d->angle);

    d->drawCircle(&painter);
    d->drawPie(&painter);
    d->drawArrow(&painter);
    d->drawImages(&painter);
}

工程代码下载链接:Qt圆形环状菜单

  • 2
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
### 回答1: Qt自定义Ribbon菜单可以通过以下步骤完成。 首先,创建一个新的Qt项目。在项目中包含QtRibbon控件相关的头文件和库。 其次,定义你想要的Ribbon菜单的外观和布局。可以使用Qt提供的默认样式,也可以通过修改样式表来自定义外观。 接下来,创建菜单项。可以使用QAction或者QMenu来创建菜单项,然后将它们添加到Ribbon菜单中。 然后,设置菜单项的图标和文字。可以使用QIcon类来设置菜单项的图标,使用setText()方法来设置菜单项的文字。 接着,为菜单项添加功能。可以连接菜单项的triggered()信号到槽函数中,实现菜单项的点击功能。 最后,展示Ribbon菜单。将Ribbon菜单添加到主窗口的布局中,然后显示主窗口。 需要注意的是,Ribbon菜单是一个相对较新的控件,并且在不同的平台上可能有不同的外观和行为。因此,在自定义Ribbon菜单时,需要仔细测试和调整以确保在不同平台上都有良好的用户体验。 希望以上回答能对您有所帮助。 ### 回答2: Qt是一个跨平台的C++开发框架,提供了丰富的功能和工具,可以用于开发桌面应用程序。自定义Ribbon菜单是其中的一个功能。 Ribbon菜单是一种常见的用户界面设计元素,它通常用于快速访问常用的功能和工具。Qt提供了QtitanRibbon插件,可以方便地实现自定义的Ribbon菜单。 要自定义Ribbon菜单,首先需要安装QtitanRibbon插件。安装完成后,可以在Qt Designer中添加Ribbon控件,并根据需要调整其外观和行为。可以设置菜单的布局、样式、颜色等属性,并添加自定义的按钮和选项。 在代码中,可以使用QtitanRibbon提供的API来处理Ribbon菜单的事件和用户交互。可以定义槽函数来响应按钮的点击、选项的选择等操作。通过槽函数,可以实现具体的功能逻辑,例如打开文件、保存数据等操作。 除了使用QtitanRibbon插件,也可以使用Qt自带的工具和功能来实现自定义的Ribbon菜单。可以使用QToolBar、QAction等类来创建菜单的控件和按钮,并使用信号和槽机制来处理用户的交互。可以自定义菜单的布局、样式和行为,并根据需要添加自定义的功能和工具。 总之,通过使用Qt提供的功能和工具,可以方便地实现自定义的Ribbon菜单。无论是使用QtitanRibbon插件还是Qt自带的功能,都可以根据需求来设计和实现用户友好的Ribbon菜单界面。 ### 回答3: 在Qt自定义Ribbon菜单可以通过以下步骤实现: 1. 创建一个新的Qt应用程序项目并打开你想要添加自定义Ribbon菜单的主窗口。 2. 在主窗口中添加一个QMainWindow和一个QMenuBar。 3. 创建一个新的QWidget,作为Ribbon菜单的容器。 4. 将QWidget设置为QMainWindow的centralWidget(),以便显示Ribbon菜单。 5. 使用QVBoxLayout或其他布局管理器,将Ribbon菜单中的各个功能区或选项分组逐个添加到QWidget中。 6. 为每个功能区创建一个QGroupBox,并使用QGridLayout或其他布局管理器在功能区中添加需要的控件和操作。 7. 根据需要向每个功能区中添加按钮、复选框、下拉列表等控件,并为它们添加相应的槽函数或信号连接。 8. 在主窗口的菜单栏中添加一个“Ribbon”选项,用于显示/隐藏Ribbon菜单。 9. 在“Ribbon”选项的槽函数中,通过QWidget的setVisible()函数来显示或隐藏Ribbon菜单。 10. 运行程序,你将看到自定义的Ribbon菜单在主窗口中显示,并且可以与其中的控件进行交互。 需要注意的是,Qt并没有提供内置的Ribbon菜单控件,因此我们需要自己创建一个类似于Ribbon菜单的容器,并在其中添加各种控件和操作。此外,可以根据自己的需求和设计风格来自定义Ribbon菜单的样式和布局。 希望以上回答能对你有所帮助。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值