2015-07-29 2 views
1

В настоящее время я пытаюсь сделать QToolButton похожим на эквивалент в Office.Офис, как QToolButton

Он должен выглядеть следующим образом:

enter image description here

Я знаю, что я могу получить доступ к кнопке меню с QToolButton :: меню кнопки, но QToolButton :: меню кнопка: парить такое же, как QToolButton: парить так Я не могу различаться между ними, и я не могу установить границу только для кнопки QToolButton :: menu. Есть идеи?

ответ

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.

После того, как нам нужно переопределить размер, 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 можно установить для офиса-подобных эффектов.

Это всего лишь один из возможных способов реализовать это, я надеюсь, что это будет полезно для вас.

Он похож на экране для меня: enter image description here

из задних, это не конечный результата, вам нужно перекрасить его, как вы хотите или использовать styles для плоского стиля.

+0

спасибо. Просто надеялся, что есть более простой способ с таблицами стилей: / – SunBlack

Смежные вопросы