首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >像QToolButton这样的办公室

像QToolButton这样的办公室
EN

Stack Overflow用户
提问于 2015-07-29 09:18:10
回答 1查看 539关注 0票数 1

目前,我试图在Office中使一个QToolButton看起来类似于它。

它应该是这样的:

我知道我可以用QToolButton::menu -按钮访问菜单按钮,但是QToolButton::menu-按钮:悬停和QToolButton:悬停是一样的,所以我不能两者都不同,我不能为QToolButton::menu-按钮设置一个边框。有什么想法吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-07-29 11:48:05

您可以创建类似拆分按钮的东西。

代码语言:javascript
复制
class SplitButton : public QPushButton
{
    Q_OBJECT
public:
    explicit SplitButton(QWidget *parent = 0);
    void setMenu(QMenu* menu);

protected:
    void resizeEvent ( QResizeEvent * );
    void mousePressEvent ( QMouseEvent * );
private:
    QFrame* line;
};

添加了通过setMenu()方法插入菜单的机会。QFrame是区分按钮和弹出菜单所必需的。

在构造函数处,只需初始化基类:

代码语言:javascript
复制
#include <QFrame>
#include <QMenu>
#include <QResizeEvent>

SplitButton::SplitButton(QWidget *parent):
    QPushButton(parent)
{

}

弹出菜单将按如下方式添加:

代码语言:javascript
复制
void SplitButton::setMenu( QMenu* menu )
{
    if (menu) {
        line = new QFrame(this);
        line->setFrameShape(QFrame::VLine);
        line->setFrameShadow(QFrame::Sunken);

        QPushButton::setMenu(menu);
        connect(menu, &QMenu::triggered, [=](QAction *act) {
           setText(act->text());
        });
    }
}

如您所见,我们使用QPushButton::setMenu()方法并将菜单触发信号连接到插槽,用labda实现,因此需要包括c++11兼容性

在我们需要重写大小调整之后,mousePress和keyPressed事件。作为最小的例子,我做了第二次。

代码语言:javascript
复制
void SplitButton::resizeEvent ( QResizeEvent * event )
{
    if (menu()) {
        int width  = event->size().width();
        int height = event->size().height();
        line->setGeometry(QRect(width - 18, 4, 3, height - 8));
    }
}

在调整大小事件时,如果菜单可用,我们按偏移量为伪按钮添加帧。

代码语言:javascript
复制
void SplitButton::mousePressEvent( QMouseEvent * event )
{
    if (menu()) {
        if ( width()-event->x() <= 15 )
            showMenu();
        else
            setDown(true);
    } else {
        QPushButton::mousePressEvent(event);
    }
}

对于mousePress事件,我们只需选择我们想要做的:显示菜单或按钮。

用法:

代码语言:javascript
复制
MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent), m_file(QString())
{
    setupUi(this);  

    SplitButton *split = new SplitButton;
    split->setText("B");
    QMenu *menu = new QMenu;
    menu->addAction("Y");
    menu->addAction("B");
    menu->addAction("U");

    split->setMenu(menu);
    split->setCheckable(true);
    Ui::MainWindow::mainToolBar->addWidget(split);
}

您还可以为类似Office的效果设置按钮可检

这只是认识到这一点的可能方法之一,我希望这会对你有所帮助。

对我来说就像在屏幕上:

当然,这并不是最终的结果,你需要像你想要的那样重新绘制它,或者使用样式作为平版风格。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31696218

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档