请看一下这张照片:
您可以在其中心看到一个带有一些愚蠢内容和上下文菜单的QTableView。我的问题是,当我打开上下文菜单时,如果我点击表格(无论哪个按钮被按下)视图(我希望上下文菜单在Windows程序中消失,然后如果正确的按钮则显示在新的位置被压了)我的程序立刻崩溃了。我这样创建它:
connect(tableView, SIGNAL(customContextMenuRequested(const QPoint&)),
this, SLOT(showContextMenu(const QPoint&)));
void MainWindow :: showContextMenu(const QPoint &_point)
{
QPoint pos = tableView->mapToGlobal(_point);
QModelIndex index = tableView->currentIndex();
int row = index.row();
QMenu menu;
menu.addAction("Test 1");
menu.addAction("Test 2");
QAction *action = menu.exec(pos);
QString text = action->text();
if (text == "Test 1")
qDebug("Test 1");
else
if (text == "Test 2")
qDebug("Test 2");
else
qDebug("Vzdroch");
}
我不知道它崩溃的原因。在QtCreator中没有调试器这样的东西,即它安装它就像向太空发射火箭一样复杂。我需要的只是像往常一样处理上下文菜单区域之外的鼠标点击。
我知道你可能很难找到崩溃的原因,所以我会稍微缓解一下我的问题。当鼠标超出其区域时,有没有办法让上下文菜单消失? Qt中有一个名为hovered()
的信号。当用户鼠标悬停在窗口小部件上时会发出它,因此我正在搜索一个信号,让我们称之为unhovered()
,当用户将鼠标从窗口小部件上移开时发出。不幸的是我没有找到这样的信号。有没有办法让我的程序知道鼠标已关闭?
希望我完全描述了我的问题。
答案 0 :(得分:3)
QMenu::exec
将返回0。
在取消引用之前,您需要检查action
,否则您将取消引用导致未定义行为的空指针。
QAction *action = menu.exec(pos);
if (!action) {
qDebug() << "no menu selected";
} else {
QString text = action->text();
...
}