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 ます。そうしないと、null ポインターが逆参照され、未定義の動作が発生します。

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