在 Qt 里给按钮挂一个左键弹出的菜单,思路是先准备好 QMenu 和里面的 QAction,再把按钮的点击信号连到一个槽函数,由槽函数在光标位置调用 menu->exec() 把菜单弹出来。下面这段代码里 slot_set() 负责弹菜单,构造部分负责把 "关于" 和 "设置" 两个动作添加进菜单,并把各自的 triggered() 信号接到对应的槽,最后再把按钮 pushButton_6 的 clicked() 信号连到 slot_set()。
void MainWindow::slot_set()
{
menu->exec(QPoint(QCursor::pos().x(), QCursor::pos().y() + 15));
}
about_action = new QAction("\345\205\263\344\272\216", this);
auto set_action = new QAction("\350\256\276\347\275\256", this);
connect(about_action, SIGNAL(triggered()), this, SLOT(slot_about_()));
connect(set_action, SIGNAL(triggered()), this, SLOT(slot_set_()));
menu = new QMenu(this);
menu->addAction(set_action);
menu->addAction(about_action);
connect(ui->pushButton_6, SIGNAL(clicked()), this, SLOT(slot_set()));
这里有几个容易踩的小点:菜单弹出位置用 QCursor::pos() 拿到全局坐标,再在 y 轴上额外加 15 个像素,避免菜单正好盖住鼠标指针;QAction 的文本用了八进制转义的 UTF-8 字节序列来表示中文 "关于" 和 "设置",这是为了规避源文件编码问题;两个动作的触发信号分别连到 slot_about_() 和 slot_set_(),注意这两个槽名结尾都带下划线,和外层的 slot_set() 不是同一个函数。