QMenu *menu = action->parentWidget();在qt5用不了
时间: 2024-02-05 19:11:49 浏览: 25
在Qt5中,QAction类已经没有parentWidget()成员函数了,因此您需要使用QMenu的静态函数QMenu::parentWidget()来获取该动作所属的菜单,如下所示:
```
QMenu *menu = qobject_cast<QMenu*>(sender()->parentWidget());
```
请注意,这里使用了QObject::sender()函数来获取发送信号的对象,因此需要在发射信号时将该动作作为参数传递。
相关问题
QMenu *menu = qobject_cast<QMenu*>(action->parent());
这段代码的作用是将`action`的父对象转换为`QMenu`类型的指针,并将结果赋值给`menu`。
`qobject_cast`是Qt中的一个函数模板,用于执行动态类型转换。它类似于C++中的`dynamic_cast`,但更加安全,因为它使用了Qt的元对象系统来检查类型信息。如果类型转换失败,`qobject_cast`会返回一个空指针。
在这个例子中,`action->parent()`返回`action`的父对象,该对象可能是`QMenu`或其他类型的对象。为了访问`QMenu`的成员函数和数据成员,我们需要将它转换为`QMenu`类型的指针。如果父对象不是`QMenu`类型,`qobject_cast`将返回一个空指针,因此我们需要在使用`menu`之前检查它是否为`nullptr`。
void frmMap::mousePressEvent(QMouseEvent *event) { if (event->button() == Qt::LeftButton) { qDebug() << "Left button pressed at (" << event->x() << ", " << event->y() << ")"; } else if (event->button() == Qt::RightButton) { //new一个删除muen 的action,该删除action,connect,删除槽 } }
这是一个 Qt 程序中鼠标点击事件的处理函数。当鼠标左键被按下时,会输出该点的坐标。当鼠标右键被按下时,应该创建一个菜单(QMenu),添加一个删除(Delete)动作(QAction),并将该动作与删除槽(slot)连接起来。
示例代码如下:
```
void frmMap::mousePressEvent(QMouseEvent *event) {
if (event->button() == Qt::LeftButton) {
qDebug() << "Left button pressed at (" << event->x() << ", " << event->y() << ")";
}
else if (event->button() == Qt::RightButton) {
QMenu menu(this);
QAction* deleteAction = new QAction(tr("Delete"), this);
connect(deleteAction, &QAction::triggered, this, &frmMap::onDelete);
menu.addAction(deleteAction);
menu.exec(event->globalPos());
}
}
void frmMap::onDelete() {
// handle delete action here
}
```
在 `onDelete()` 函数中,你可以编写删除操作的代码。注意,这里的 `this` 指针指向的是当前窗口对象,因此需要确保 `frmMap` 类中有 `onDelete()` 的定义。