您的位置:首页 > 编程语言 > Qt开发

提升方式创建自己的QT控件(弹出式菜单按钮)

2015-07-13 22:07 1406 查看
这里简单说明,以提升方式,创建自己的弹出式菜单按键,注意这种按钮,并不是QPushButton里面的setMenu,函数而变形的,而且也没有那种,下拉的倒立小三角形。

实验步骤:

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/
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: