提升方式创建自己的QT控件(弹出式菜单按钮)
2015-07-13 22:07
1406 查看
这里简单说明,以提升方式,创建自己的弹出式菜单按键,注意这种按钮,并不是QPushButton里面的setMenu,函数而变形的,而且也没有那种,下拉的倒立小三角形。
实验步骤:
说白了,这里的按键菜单的原理,就是在原QPushButton上面新建一个QMeun对象,然后,让这个Menu在按键下面的适当位置弹出来,当然也可以在上面,或者任意位置。调用了其exec函数,参数为弹出地点坐标。
转载于: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_Hqmenubutton.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_Hwidget.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/
相关文章推荐
- A previous installation of Qt5 Visual Studio Add-in was detected. 解决方法
- smart210上Qt应用程序开发实例(加法计算器)
- 错误:QtXml: No such file or directory
- QT父窗口和子窗口互相通信
- QT5.3.2在ARM上的移植
- Qt批量操作Excel
- SPOJ QTREE6 lct
- HTML5 仿QT 示例Drag and Drop Robot 换装机器人
- 【Qt】字符编码、乱码总结
- Qt跨平台的一个例程
- SPOJ QTREE4 lct
- MQTT-SN协议乱翻之小结篇
- MQTT-SN协议乱翻之实现要点
- MQTT-SN协议乱翻之功能描述
- MQTT-SN协议乱翻之消息格式
- MQTT-SN协议乱翻之简要介绍
- MQTT 3.1.1,值得升级的6个新特性
- MQTT 3.1协议非严肃反思录
- MQTT协议笔记之mqtt.io项目HTTP协议支持
- MQTT协议笔记之mqtt.io项目Websocket协议支持