Qt中有没有现成的控件可以直接实现这种效果?
时间: 2024-12-24 07:39:05 浏览: 2
是的,在Qt中有一个现成的控件可以直接实现类似二级下拉菜单的效果,那就是`QToolButton`结合`QMenu`。你可以创建一个`QToolButton`,设置一个`QActionGroup`关联多个`QAction`,每个`QAction`代表一级菜单,当点击工具按钮时,弹出`QMenu`显示所有一级菜单选项,并对特定的动作关联一个二级菜单。
示例代码如下:
```cpp
QToolButton toolButton(parent);
toolButton.setText("一级菜单");
QActionGroup actionGroup(this);
for (const auto& menuName : firstLevelMenus) {
QAction* action = new QAction(menuName, this);
action->setData(menuName); // 存储二级菜单名称
actionGroup.addAction(action);
connect(action, &QAction::triggered, [this, menuName]() {
// 打开对应的二级菜单
if (menuName == "二级菜单") {
// 实例化二级菜单,如 QMenu 或者 QMenuModel
QMenu* subMenu = createSubMenu(menuName);
subMenu->popup(toolButton.mapToGlobal(QPoint()));
}
});
}
toolButton.setDefaultAction(actionGroup.actions()[0]);
actionGroup.triggered.connect([](QAction* action) {
// 关闭当前已打开的二级菜单
if (auto currentAction = qobject_cast<QAction*>(sender());
currentAction && !currentAction->isSeparator()) {
for (auto* siblingAction : currentAction->parent()->actions()) {
if (siblingAction != currentAction && siblingAction->isVisible()) {
siblingAction->setVisible(false);
}
}
}
});
// 创建二级菜单函数,自行实现
QMenu* createSubMenu(const QString& menuName) {
// ...在这里填充二级菜单内容
return new QMenu();
}
```
阅读全文