質問

次のようにコンテキストメニューがインストールされた QTreeView クラスがあります:

m_ui.tree->setContextMenuPolicy(Qt::CustomContextMenu);
connect(m_ui.tree, SIGNAL(customContextMenuRequested(const QPoint&)),
        this, SLOT(ShowTreeContextMenu(const QPoint&)));
...
void ShowTreeContextMenu(const QPoint& point)
{
   m_treeContextMenu->exec(m_ui.tree->viewport()->mapToGlobal(point));
}

ただし、コンテキストメニューが表示されている場合、 QTreeView はマウスクリックに応答しなくなります。コンテキストメニューが表示されている間に QTreeView の項目をクリックすると、コンテキストメニューは削除されますが、クリックされた項目は選択されません。

これは、コンテキストメニューが新しいアイテムの上にポップアップするため、新しいアイテムを右クリックしたときに特に混乱を招きますが、アイテムが選択されなかったため、コンテキストメニューの内容は以前に選択したアイテムを参照しています。

役に立ちましたか?

解決

使用しているQtのバージョンはわかりませんが、Qt4.4.0でも同じ問題が見つかりました。4.3で機能しました。これをバグとしてTrolltechに報告しました 225615

これはまだ保留中としてマークされているため、その間、右クリックをインターセプトして自分で選択するというシャイの提案に従います。

他のヒント

検証していない可能性のある解決策は、右クリックのクリックイベントをキャプチャし、ツリービューで選択を手動で行い、次に親クリックイベントを呼び出して、コンテキストメニューをアクティブにすることです。

QTreeViewをサブクラス化し、プロテクトメソッドvoid contextMenuEvent(QContextMenuEvent * event);を追加します。このメソッドでは、QMenuを実行します。

class TreeView : public QTreeView{
  Q_OBJECT
public:
  TreeView(QWidget *parent);
  ~TreeView();
protected:
  void contextMenuEvent(QContextMenuEvent *event);
};

void TreeView::contextMenuEvent(QContextMenuEvent *event){
  QMenu menu(this);
  menu.addAction(action1);
  menu.addAction(action2);
  //...
  menu.addAction(actionN);
  menu.exec(event->globalPos());
}
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top