在Qt中点击按钮弹出菜单,这功能很好写,调用QPushButton的setMenu方法即可,但是,这种点击按钮弹出菜单的效果是很不爽的,需要两次点击才弹出菜单,第一次点击按钮右侧出现箭头,第二次点击才弹出菜单,而且菜单不是居中显示,这些问题该如何处理呢。
点击按钮弹出弹出菜单的代码
m_pSetMenu = new QMenu(this); QAction *pAct1 = new QAction("game mode", this); QAction *pAct2 = new QAction("work mode", this); QAction *pAct3 = new QAction("help", this); m_pSetMenu->addAction(pAct1); m_pSetMenu->addAction(pAct2); m_pSetMenu->addAction(pAct3); ui->btnSet->setMenu(m_pSetMenu);
运行结果
我们先把右侧的箭头去掉,修改样式表,即可去掉箭头,如下
ui->btnSet->setStyleSheet("QPushButton::menu-indicator{image:none}");
但是点击两次的问题还是没有解决,设置为根据鼠标的位置弹出:
m_pSetMenu->exec(QPoint(QCursor::pos().x(), QCursor::pos().y()));
本例子全部代码
.h
#ifndef WIDGET_H #define WIDGET_H #include#includeQT_BEGIN_NAMESPACE namespace Ui { class Widget; } QT_END_NAMESPACE class Widget : public QWidget { Q_OBJECT public: Widget(QWidget *parent = nullptr); ~Widget(); public slots: void on_btnSet_clicked(); private: Ui::Widget *ui; QMenu* m_pSetMenu; }; #endif // WIDGET_H
.cpp
#include "widget.h" #include "ui_widget.h" Widget::Widget(QWidget *parent) : QWidget(parent) , ui(new Ui::Widget) { ui->setupUi(this); m_pSetMenu = new QMenu(this); ui->btnSet->setStyleSheet("QPushButton::menu-indicator{image:none}"); } Widget::~Widget() { delete ui; } void Widget::on_btnSet_clicked() { QAction *pAct1 = new QAction("game mode", this); QAction *pAct2 = new QAction("work mode", this); QAction *pAct3 = new QAction("help", this); m_pSetMenu->addAction(pAct1); m_pSetMenu->addAction(pAct2); m_pSetMenu->addAction(pAct3); ui->btnSet->setMenu(m_pSetMenu); m_pSetMenu->exec(QPoint(QCursor::pos().x(), QCursor::pos().y())); }
运行结果