如何在不崩溃应用程序的情况下使上下文菜单消失?

时间:2012-12-22 08:56:49

标签: c++ qt contextmenu qt-creator

请看一下这张照片:

enter image description here

您可以在其中心看到一个带有一些愚蠢内容和上下文菜单的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(),当用户将鼠标从窗口小部件上移开时发出。不幸的是我没有找到这样的信号。有没有办法让我的程序知道鼠标已关闭?

希望我完全描述了我的问题。

1 个答案:

答案 0 :(得分:3)

如果没有选择菜单项,

QMenu::exec将返回0。

在取消引用之前,您需要检查action,否则您将取消引用导致未定义行为的空指针。

QAction *action =  menu.exec(pos);
if (!action) {
  qDebug() << "no menu selected";
} else {
  QString text  = action->text();
  ...
}