像QToolButton这样的办公室

时间:2015-07-29 09:18:11

标签: qt qtstylesheets

我目前试图让QToolButton在Office中看起来像等效。

它应该是这样的:

enter image description here

我知道我可以使用QToolButton :: menu-button访问菜单按钮,但是QToolButton :: menu-button:hover与QToolButton相同:hover所以我不能同时在两者之间有所不同而且我不能为QToolButton :: menu-button设置边框。有什么想法吗?

1 个答案:

答案 0 :(得分:1)

您可以创建类似拆分按钮的内容。

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

在构造函数中初始化基类:

#include <QFrame>
#include <QMenu>
#include <QResizeEvent>

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

}

弹出菜单将添加如下:

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()方法并将菜单triggered信号连接到插槽,通过labda实现,因此您需要include c++11 compatibility

我们需要覆盖resize,mousePress和keyPressed事件。作为最小的例子我做了第二次。

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));
    }
}

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

void SplitButton::mousePressEvent( QMouseEvent * event )
{
    if (menu()) {
        if ( width()-event->x() <= 15 )
            showMenu();
        else
            setDown(true);
    } else {
        QPushButton::mousePressEvent(event);
    }
}

对于mousePress事件,我们只选择我们想要做的事:show menu或push button。

用法:

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的效果设置按钮chechable

这只是实现这一目标的可能方法之一,我希望它对您有所帮助。

我在屏幕上看起来像: enter image description here

对于cource来说,这不是最终结果,你需要像你想要的那样重新绘制它,或者使用styles来做平面风格。