我目前试图让QToolButton在Office中看起来像等效。
它应该是这样的:
我知道我可以使用QToolButton :: menu-button访问菜单按钮,但是QToolButton :: menu-button:hover与QToolButton相同:hover所以我不能同时在两者之间有所不同而且我不能为QToolButton :: menu-button设置边框。有什么想法吗?
答案 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。
这只是实现这一目标的可能方法之一,我希望它对您有所帮助。
对于cource来说,这不是最终结果,你需要像你想要的那样重新绘制它,或者使用styles来做平面风格。