マウスボタン検出用のカスタムQACTION/QMENU
質問
特定のアイテムに押されたマウスボタンを検出できるポップアップメニューを作成しようとしています。カスタムを作成しました QAction
すでに私を構築するために QMenu
, 、 しかし triggered
メニュー項目が押されたときの信号は、 QMouseEvent
押したボタンを照会するために。
また、それぞれのステータスのヒントを設定しています QAction
, 、私がマウスの上にマウスをするときにステータスバーに表示されますが、閉じた後もとどまります QMenu
. 。これは通常の動作ですか?
解決
何が欲しいか理解していたかどうかはわかりません。ただし、右マウスクリックにポップアップメニューを表示する場合は、最初はマウスイベントに関連するウィジェット(またはウィンドウクラス)オーバーライド関数のヘッダーファイルで、ポップアップメニューを表示する機能を宣言する必要があります。したがって、ヘッダーファイルにはこれらの宣言を含める必要があります。
...
void Popup(const QPoint& pt);
void mousePressEvent(QMouseEvent *event);
...
および関数のCPPファイル定義で:
void testQt::mousePressEvent(QMouseEvent *event)
{
if (event->button() == Qt::RightButton) {
this ->Popup(event ->pos());
event->accept();
}
}
void testQt::Popup(const QPoint& pt)
{
QPoint global = this ->mapToGlobal(pt);
QMenu* pPopup = new QMenu(this);
QAction* pAction1 = new QAction("Item 1", this);
QAction* pAction2 = new QAction("Item 2", this);
pPopup ->addAction(pAction1);
pPopup ->addAction(pAction2);
QAction* pItem = pPopup ->exec(global);
if(pItem == pAction1)
{
}
else if(pItem == pAction2)
{
}
}
これで、右マウスボタンを押すと、ポップアップメニューがカーソルの位置に表示されます。これが役立つことを願っています。
注:アクションが選択されたときにマウスボタンが押されるかを検出する場合は、Qmenuから独自のクラスを継承する必要があります。 Qmenuクラスには保護された関数が含まれています mousePressEvent(QMouseEvent *event)
これはOverridenである必要があります。メニューでアイテムが選択されたときに左または右のマウスボタンが押されているかどうかを検出できます。
他のヒント
私はこれが非常に古い投稿であることを知っています。ただし、ポップアップメニュー/コンテキストメニューでクリックしたボタンを知りたい場合。ボタンを押すと、それは信号やスロットなどに接続されているとしましょう。 sender();
. 。これはaを返します QObject
あなたがあなたにキャストすることができます QAction*
そして、そこからデータなどを取得します。
void MyClass::showMenu()
{
auto action(new QAction*("Blah", ui->my_toolbar));
QObject::connect(action, &QAction::triggered, this, &MyClass::mySlot);
}
void MyClass::mySlot()
{
auto myAction(static_cast<QAction*>(sender()));
myAction->doAwesomeStuff();
}