QT-QRibbon样式框架的使用,支持窗口控件拖拉和停靠效果

这篇博客介绍了如何使用QT的QRibbon样式框架来实现窗口控件的拖放和停靠效果,以及对菜单栏进行美化。关键代码包括设置透明度动画、创建QMenuBar、将菜单项转换为QToolButton并添加到窗口,同时移除原有的菜单项。此外,还展示了如何处理窗口最小化和关闭操作。提供了完整的代码示例链接供读者参考。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

QT-QRibbon样式框架的使用,支持窗口控件拖拉和停靠效果

一、演示预览

在这里插入图片描述

二、关键代码

代码如下:

   _->_mainWindow = window;

    // 设置透明度渐变动画
    if (!_->opacityAnimation.targetObject())
    {
        _->opacityAnimation.setTargetObject(_->_mainWindow);
        _->opacityAnimation.setPropertyName("windowOpacity");
        _->opacityAnimation.setStartValue(1.0);
        _->opacityAnimation.setEndValue(1.0);
    }

    QMenuBar *menuBar = _->_mainWindow->menuBar();

    if (!menuBar)
    {
        return;
    }

    connect(ui->pushButtonMinimum, &QPushButton::clicked, _->_mainWindow, &QWidget::showMinimized);
    connect(ui->pushButtonClose, &QPushButton::clicked, _->_mainWindow, &QWidget::close);

    ui->tabWidgetMenuBar->clear();

    auto menus = menuBar->actions();
    for (auto i : menus)
    {
        auto menu = i->menu();

        QList<QAction *> actions;

        // 当没有菜单时
        if (!menu)
            actions.push_back(i);
        else
            actions = menu->actions();

        auto widget = new QWidget;
        auto layout = new QHBoxLayout(widget);
        widget->setLayout(layout);

        for (auto a : actions)
        {
            QWidget *w;
            if (a->isSeparator())
            {

                auto line = new QWidget();
                line->setFixedWidth(1);
                line->setStyleSheet("background:rgb(177,177,177)");
                w = line;
            }
            else
            {
                _->_mainWindow->addAction(a);

                QToolButton *btn = new QToolButton;

                btn->setText(a->text());
                btn->setToolTip(a->text());
                btn->setStatusTip(a->text());

                a->setToolTip(a->text());
                a->setStatusTip(a->text());

                btn->setIconSize(QSize(32, 32));
                btn->setAutoRaise(true);

                if (a->menu())
                {
                    btn->setPopupMode(QToolButton::MenuButtonPopup);
                }
                btn->setToolButtonStyle(Qt::ToolButtonTextUnderIcon);

                btn->setCheckable(a->isCheckable());
                btn->setChecked(a->isChecked());

                // 无图标则自动添加默认图标
                if ( a->icon().isNull() )
                {
                    static QIcon defaultIcon(":/image/Bar.net.png");
                    a->setIcon(defaultIcon);
                }
                btn->setDefaultAction(a);

                w = btn;
            }
            layout->addWidget(w);
        }

        layout->setSpacing(6);
        layout->addSpacerItem(new QSpacerItem(1, 1, QSizePolicy::Expanding));
        ui->tabWidgetMenuBar->addTab(widget, i->text());


		// 从菜单栏移除原有菜单项,否则当鼠标单击菜单位置时。仍会弹出菜单项
        menuBar->removeAction(i);	
    }

    window->setWindowFlag(Qt::FramelessWindowHint, true);

    QObject::connect(window, &QMainWindow::windowTitleChanged, this, &QRibbon::setWindowTitle);
    this->setWindowTitle(window->windowTitle());

    window->installEventFilter(this);

    window->menuBar()->setParent(0);
    window->setMenuBar(this);

    _styleMenu->actions()[0]->trigger();

    _->_originGeometry = window->normalGeometry();

三、代码链接

https://download.youkuaiyun.com/download/u013083044/52894234

在Visual Studio中,可以通过拖拽工具栏来实现一些特定的功能。具体的步骤如下: 1. 首先,确保你已经安装了WeifenLuo.WinFormsUI.Docking这个控件库。你可以通过右键单击引用,选择NuGet,然后下载安装这个控件库。 2. 在你的窗体上创建一个DockPanel控件。这个控件是用来容纳其他子窗体的容器。 3. 当你想要拖拽一个工具栏到DockPanel上时,你需要创建一个继承自WeifenLuo.WinFormsUI.Docking.DockContent的子窗体。确保你的子窗体已经继承了DockContent,这样在对其进行拖拉拽时才会响应停靠、移动、拉伸等功能。 4. 创建一个工具栏控件,并将其添加到你的子窗体中。你可以在工具栏上添加按钮、标签等控件,用来执行特定的操作。 5. 在菜单工具栏中的按钮对应的槽函数中,编写代码来实现你想要的功能。例如,当你点击打开按钮时,可以打开一个选择文件对话框,让用户选择一个txt文件,然后将文件内容显示到TextEdit中。 这样,当你在Visual Studio中拖拽工具栏时,你的子窗体会响应相应的停靠、移动、拉伸等功能,并执行你在槽函数中定义的操作。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* [Winform模拟Visual Studio工具栏拖拉拽、停靠](https://blog.youkuaiyun.com/qq_36694133/article/details/131290924)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *3* [《Qt+Visual Studio 2013》第三章 菜单栏工具栏](https://blog.youkuaiyun.com/weixin_37934835/article/details/123352569)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

进击的大海贼

联系博主,为您提供有价值的资源

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值