Вы можете создать что-то вроде кнопки разделения.
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.
После того, как нам нужно переопределить размер, mousePress и keyPressed events. Как минимальный exmaple я сделал второй.
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);
}
И вы кнопку chechable можно установить для офиса-подобных эффектов.
Это всего лишь один из возможных способов реализовать это, я надеюсь, что это будет полезно для вас.
Он похож на экране для меня:
из задних, это не конечный результата, вам нужно перекрасить его, как вы хотите или использовать styles для плоского стиля.
спасибо. Просто надеялся, что есть более простой способ с таблицами стилей: / – SunBlack