1

私のqmlウィジェットにはContextMenuが必要です。QMenuを含むQGraphicsProxyWidgetを作成しますが、問題があります。メインウィンドウの外にコンテキストメニューが表示されません。メインウィンドウをメニューの親として設定するには? カスタム コンポーネントは悪い考えです。実行、アクション、ポップアップなど、QMenu の可能性が必要です。

メイン.qml

import QtQuick 1.1
import CustomComponents 1.0

Rectangle {
    width: 360
    height: 360
    QMLContextMenu {
        id: menu
    }

    Text {
        text: qsTr("Hello World")
        anchors.centerIn: parent
    }
    MouseArea {
        anchors.fill: parent
        acceptedButtons: Qt.RightButton | Qt.LeftButton
        onClicked: {
            if(mouse.button === Qt.RightButton)
                menu.exec(mouse.x, mouse.y);
            else
                Qt.quit();
        }
    }
}

main.cpp

#include <QApplication>
#include "qmlapplicationviewer.h"
#include <QtCore>
#include <QtDeclarative>
#include <QtGui>

class QMLContextMenu : public QGraphicsProxyWidget
{
    Q_OBJECT
public:
    QMLContextMenu(QGraphicsItem* parent = 0) : QGraphicsProxyWidget(parent)
    {
        menuWidget = new QMenu("my menu");
        setWidget(menuWidget);
    }
public slots:
    QString exec(int x, int y)
    {
        menuWidget->clear();
        menuWidget->addAction("hello world!");
        menuWidget->addSeparator();
        menuWidget->addAction("or not...");
        //menuWidget->show();
        QAction *pResultAction = menuWidget->exec(QPoint(x, y));
        QString text;
        if(pResultAction)
            text = pResultAction->text();
        return text;
    }
private:
    QMenu *menuWidget;
}; 

Q_DECL_EXPORT int main(int argc, char *argv[])
{
    QScopedPointer<QApplication> app(createApplication(argc, argv));
    qmlRegisterType<QMLContextMenu>("CustomComponents", 1, 0, "QMLContextMenu");
    QmlApplicationViewer viewer;
    viewer.setOrientation(QmlApplicationViewer::ScreenOrientationAuto);
    viewer.setMainQmlFile(QLatin1String("qml/quick1/main.qml"));
    viewer.showExpanded();
    return app->exec();
}
4

1 に答える 1

1

リストビューで独自の長方形を作成します。しかし、qml 1 では qml ウィジェットをトップレベルのウィンドウにすることができないため、この方法には多くの問題があります。私はそれをしました:

  1. 別の ContextMenu.qml を作成する
  2. ローダーを使用してインスタンス化する
  3. 必要なときに見せる
于 2013-09-29T00:42:05.540 に答える