0

特定の項目に対して押されたマウス ボタンを検出できるポップアップ メニューを作成しようとしています。QActionをビルドするために既にカスタムを作成しましたQMenutriggered、メニュー項目が押されたときの信号は、押さQMouseEventれたボタンを照会するための を提供しません。

また、各 のステータス ヒントを設定していますQAction。これは、マウス カーソルを合わせるとステータス バーに表示されますが、 を閉じた後も残りますQMenu。これは正常な動作ですか?

4

2 に答える 2

3

あなたが何を望んでいるのか理解できたかどうかわかりません。ただし、マウスの右クリックでポップアップ メニューを表示する場合は、最初にウィジェット (またはウィンドウ クラス) のヘッダー ファイルでマウス イベントに関連する関数をオーバーライドし、ポップアップ メニューを表示する関数を宣言する必要があります。したがって、ヘッダー ファイルには次の宣言が含まれている必要があります。

...
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)、オーバーライドする必要がある保護された関数が含まれており、メニューでアイテムが選択されたときにマウスの左ボタンまたは右ボタンが押されたかどうかを検出できます。

于 2010-12-24T21:54:44.617 に答える