阡陌 发表于 2023-12-19 01:25:06

Qt 菜单



!(https://file.mculoop.com/images/2022/11/banner_1668588656.png )

当你走进饭店吃饭, 在接受饭店的服务前, 他们首先会提供一本菜单给你。有的菜单设计精美、清晰条理,有的则云里雾里、让人没有丝毫胃口。软件设计之道亦是如此, 菜单作为一种与用户交互的重要界面( User Interface )工具,至关重要。

<!--more-->



## 1、右键菜单

### 实现方法

- 用 QMenu 实现菜单
- 用 QAction 编写菜单项
- 实现菜单弹出事件或信号的响应

**QMenu**

QMenu 提供了用于菜单栏、上文菜单以及其他类型的弹出菜单(比如按钮菜单等)菜单部件,也就是说他承包了所有菜单的需求,用菜单找 QMenu 就对了。

**QAction**

QAction 可以理解为菜单上的菜名( menu text )、简介( tip )、配图( icon )等信息,但正如它的名字,它是被设计为可以插入部件中的用户界面动作的抽象。除了用于 QMenu ,工具栏 QToolBar 也是可以同样适用的。既然是 Action ,动作的实现(槽)和动作的触发( triggered 信号)就必不可少。可见 QAction 是才是菜单的个性化以及实质化所在,QMenu 只是为我们创造了一个展现的平台。

**菜单弹出事件或信号的响应**

如果是派生子类,一般可以选择重写 `void contextMenuEvent(QContextMenuEvent * event)` 函数;

如果是直接使用控件的实例,可以选择实现 `customContextMenuRequested` 信号的槽函数。只有当 `contextMenuPolicy` 为 `Qt::CustomContextMenu` 的时候控件才会发送 `customContextMenuRequested` 信号, 所以别忘记 `setContextMenuPolicy` 和连接信号槽。



### 实例

```cpp
QMenu *pop_menu = NULL;
QAction *add, *del;
void MainWindow::tableWidgetInit(void)
{
    add = new QAction("Add", this);
    del = new QAction("Delete", this);
    pop_menu = new QMenu(ui->tableWidget);
    pop_menu->addAction(add);
    pop_menu->addAction(del);
    ui->tableWidget->setContextMenuPolicy(Qt::CustomContextMenu);
    connect(ui->tableWidget, SIGNAL(customContextMenuRequested(QPoint)), \
            this, SLOT(onTableWidgetContextMenuRequested(QPoint)));
}
void MainWindow::onTableWidgetContextMenuRequested(QPoint point)
{
    pop_menu->exec(QCursor::pos());
}
```

!(https://file.mculoop.com/images/2022/11/2015-11-11_184359_1668588661.jpg)


页: [1]
查看完整版本: Qt 菜单