这里简单说明,以提升方式,创建自己的弹出式菜单按键,注意这种按钮,并不是QPushButton里面的setMenu,函数而变形的,而且也没有那种,下拉的倒立小三角形。
转载于:http://xl028.blog.163.com/blog/static/199730242201321895520830/
实验步骤:
1、新建GUI工程,这里选择一个Qwidget作为主窗口,其它默认。
2、添加C++类,这里就是弹出式菜单按键的定义,如下:
qmenubutton.h
#ifndef QMENUBUTTON_H
#define QMENUBUTTON_H
#include <QPushButton>
class QMenu;
class QMenuButton : public QPushButton
{
Q_OBJECT
public:
explicit QMenuButton(QWidget *parent = 0);//只能显示转换
QMenu * getmenu();
private slots:
void popupmenu();
private:
QMenu * menu;
};
#endif // QMENUBUTTON_H
qmenubutton.cpp
#include "qmenubutton.h"
#include <QMenu>
QMenuButton::QMenuButton(QWidget *parent) :
QPushButton(parent)
{
menu = new QMenu(this);
connect(this,SIGNAL(clicked()),this,SLOT(popupmenu()));
}
QMenu *QMenuButton::getmenu()
{
return menu;
}
void QMenuButton::popupmenu()
{ QPoint pos; //获取按键菜单的坐标
// int x = pos.x();
int y = pos.y();
// pos.setX(x + this->geometry().width()/2);
pos.setY(y+this->geometry().height());
//返回菜单下面的action不管有没被选中,可以算一个小事件循环
//里面参数的意思是在哪个坐标弹出菜单,这里将自定义的pop按键的坐标作参考,并在其下面弹出菜单
menu->exec(this->mapToGlobal(pos));
//exec(QCursor::pos()); 当前光标的坐标
}
说白了,这里的按键菜单的原理,就是在原QPushButton上面新建一个QMeun对象,然后,让这个Menu在按键下面的适当位置弹出来,当然也可以在上面,或者任意位置。调用了其exec函数,参数为弹出地点坐标。
3、在设计模式中,即widget.ui中,拖入一个QPushButton,并右键点击提升为,在弹出的对话框中输入QMenuButton,并添加,最后点提升,则已将其提升为想要的弹出式按键菜单。
4、最后,在widget.cpp中添加这个菜单按键的一些菜单
widget.h
#ifndef WIDGET_H
#define WIDGET_H
#include <QWidget>
namespace Ui {
class Widget;
}
class Widget : public QWidget
{
Q_OBJECT
public:
explicit Widget(QWidget *parent = 0);
~Widget();
private:
Ui::Widget *ui;
};
#endif // WIDGET_H
widget.cpp
#include "widget.h"
#include "ui_widget.h"
#include <QMenu>
Widget::Widget(QWidget *parent) :
QWidget(parent),
ui(new Ui::Widget)
{
ui->setupUi(this);
QMenu * menu = ui->popBtn->getmenu();//获得菜单,并向上面添加菜单
QAction* action1 = menu->addAction("action1");
QMenu* menu2 = menu->addMenu("childMenu");
QAction* action2 = menu2->addAction("action2");
QAction* action3 = menu2->addAction("action3");
QAction* action4 = menu->addAction("action4");
}
Widget::~Widget()
{
delete ui;
}
5、运行效果
转载于:http://xl028.blog.163.com/blog/static/199730242201321895520830/