目前,我试图在Office中使一个QToolButton看起来类似于它。
它应该是这样的:

我知道我可以用QToolButton::menu -按钮访问菜单按钮,但是QToolButton::menu-按钮:悬停和QToolButton:悬停是一样的,所以我不能两者都不同,我不能为QToolButton::menu-按钮设置一个边框。有什么想法吗?
发布于 2015-07-29 11:48:05
您可以创建类似拆分按钮的东西。
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()方法并将菜单触发信号连接到插槽,用labda实现,因此需要包括c++11兼容性。
在我们需要重写大小调整之后,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事件,我们只需选择我们想要做的:显示菜单或按钮。
用法:
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的效果设置按钮可检。
这只是认识到这一点的可能方法之一,我希望这会对你有所帮助。
对我来说就像在屏幕上:

当然,这并不是最终的结果,你需要像你想要的那样重新绘制它,或者使用样式作为平版风格。
https://stackoverflow.com/questions/31696218
复制相似问题