TestControl::TestControl(QWidget *parent, Qt::WFlags flags): QMainWindow(parent, flags), mp_menu(new QMenu){ ui.setupUi(this); ui.customButton->SetActiveStatePath("D:\\private\\dev\\SignatureQt\\images\\load_plan_active.png"); ui.customButton->SetNormalStatePath("D:\\private\\dev\\SignatureQt\\images\\load_plan_normal.png"); ui.customButton_2->SetActiveStatePath("D:\\private\\dev\\SignatureQt\\images\\help_active.png"); ui.customButton_2->SetNormalStatePath("D:\\private\\dev\\SignatureQt\\images\\help_normal.png"); ui.customButton_3->SetActiveStatePath("D:\\private\\dev\\SignatureQt\\images\\plan_options_active.png"); ui.customButton_3->SetNormalStatePath("D:\\private\\dev\\SignatureQt\\images\\plan_options_normal.png"); m_menu_layout.addWidget(ui.customButton); m_menu_layout.addWidget(ui.customButton_2); m_menu_layout.addWidget(ui.customButton_3); m_menu_widget.setLayout(&m_menu_layout); m_menu_widget.resize(m_menu_widget.width(), ui.customButton->height()); setMenuWidget(&m_menu_widget);}
#ifndef CUSTOMBUTTON_H#define CUSTOMBUTTON_H#include <QtGui/QAbstractButton>#include <QtDesigner/QDesignerExportWidget>class QMenu; class QDESIGNER_WIDGET_EXPORT CustomButton : public QAbstractButton{ Q_OBJECTpublic: CustomButton(QWidget *parent = 0); ~CustomButton(); QSize sizeHint() const; void SetMenu(QMenu* i_menu); void ShowMenu() const; void AddActions(QList<QAction*> i_actions); const QString& GetActiveStatePath() const; const QString& GetNormalStatePath() const; void SetNormalStatePath(const QString& i_path); void SetActiveStatePath(const QString& i_path); bool IsActive() const;public slots: void ChangeState();//todoprotected: void paintEvent(QPaintEvent *e); void mouseReleaseEvent(QMouseEvent* e); //???????????????????????????????????????????????????????????????????????????????? void mousePressEvent(QMouseEvent* e);//todo check for needing of this event method //???????????????????????????????????????????????????????????????????????????????? void enterEvent(QEvent*); void leaveEvent(QEvent*);private: bool m_is_active; QString m_normal_state_path; QString m_active_state_path; QMenu* mp_menu;//????????????????????????????????????????????????????????????????????????????????????signals: void mousePressed(); void mouseReleased();//todo check };#endif // CUSTOMBUTTON_H
#include "custombutton.h"#include <QMenu>#include <QPainter>#include <QtCore>#include <QObject>#include <QMouseEvent>#include <QImage>#include <QtGui/QMessageBox>CustomButton::CustomButton(QWidget *parent) : QAbstractButton(parent), m_is_active(false), mp_menu(NULL) {}CustomButton::~CustomButton() {}QSize CustomButton::sizeHint() const{return QSize(fontMetrics().width(text()) + 10, fontMetrics().height() + 10);}void CustomButton::SetMenu(QMenu* i_menu){ mp_menu = i_menu;}void CustomButton::ShowMenu() const{ long offset_x = 2, offset_y = 2;//todo magic numbers QPoint pop_up_point(this->pos().x() - offset_x, this->pos().y() + height());// + offset_y); mp_menu->popup(this->mapToGlobal(pop_up_point));//this->mapToGlobal(QPoint(0, 0));}void CustomButton::AddActions(QList<QAction*> i_actions){ if(!i_actions.isEmpty()) mp_menu->addActions(i_actions);}/////////////////////////////////////////////////////////////void CustomButton::SetNormalStatePath(const QString& i_path) { m_normal_state_path = i_path; }void CustomButton::SetActiveStatePath(const QString& i_path) { m_active_state_path = i_path; }const QString& CustomButton::GetActiveStatePath() const { return m_active_state_path; }const QString& CustomButton::GetNormalStatePath() const { return m_normal_state_path; }bool CustomButton::IsActive() const { return m_is_active; }void CustomButton::ChangeState() { m_is_active = !m_is_active; }/////////////////////////////////////////////////////////////void CustomButton::paintEvent(QPaintEvent* e){ QPainter painter(this); QImage image; if(m_is_active) image.load(m_active_state_path); else image.load(m_normal_state_path); resize(image.width(), image.height()); painter.drawImage(0/*pos().x()*/, 0/*pos().y()*/, image);}void CustomButton::enterEvent(QEvent*){m_is_active = true;}void CustomButton::leaveEvent(QEvent*){m_is_active = false;}void CustomButton::mouseReleaseEvent(QMouseEvent* e){ if(e->button() == Qt::LeftButton) { m_is_active = false; emit mouseReleased();//todo check repaint(rect()); if(mp_menu) ShowMenu(); }}//????????????????????????????????????????????????void CustomButton::mousePressEvent(QMouseEvent* e) { emit mousePressed(); }