0

请看这张照片:

在此处输入图像描述

您可以看到一个 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 中没有调试器之类的东西,即它是,但安装它就像向太空发射火箭一样复杂。我需要的只是像往常一样处理超出上下文菜单区域的鼠标点击。

我知道您可能很难找出它崩溃的原因,所以我会稍微缓和一下我的问题。当鼠标超出其区域时,有没有办法使该上下文菜单消失?hovered()在 Qt 中有一个名为的信号。它在用户鼠标悬停在小部件上时发出,所以我正在搜索一个信号,我们称之为它unhovered(),当用户将鼠标从小部件上移开时发出。不幸的是,我没能找到这样的信号。有没有办法让我的程序知道鼠标已关闭?

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

4

1 回答 1

3

QMenu::exec如果没有选择菜单项,则返回 0。

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

QAction *action =  menu.exec(pos);
if (!action) {
  qDebug() << "no menu selected";
} else {
  QString text  = action->text();
  ...
}
于 2012-12-22T09:03:32.427 回答