QTreeViewの選択を壊すQtコンテキストメニュー
-
05-07-2019 - |
質問
次のようにコンテキストメニューがインストールされた 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());
}
所属していません StackOverflow