2016-08-01 2 views
1

Ich bin ein einfaches Programm zu schreiben (C++, QT, QML), in dem ich resizeEvent implementieren möchten und dann andujst die Fensterhöhe und -breite mit einigen Muster . Mein Problem ist, dass wenn ich die Größe des Fensters verändere, resizeEvent nicht aufgerufen wird. Ich denke, dass ich etwas wirklich falsch mache, aber ich bin mir nicht sicher, was es ist. Irgendwelche Ideen werden geschätzt.Resize-Ereignis aus einer anderen Klasse von Qwindow in QT geerbt

main.cpp

int main(int argc, char *argv[]) 
{ 
    QCoreApplication::setAttribute(Qt::AA_EnableHighDpiScaling); 
    QGuiApplication app(argc, argv); 
    QQmlApplicationEngine engine; 
    engine.load(QUrl(QLatin1String("qrc:/main.qml"))); 
    QObject *root = engine.rootObjects().first(); 
    class CMaze maze(root,&engine); 
    return app.exec(); 
} 

CMaze.h

class CMaze: public QWindow 
{ 
public: 
    CMaze(QObject *root, QQmlApplicationEngine *engine); 
private: 
    QObject *root; 
    QQmlApplicationEngine *engine; 
    /*+ Some other variables*/ 
    void resizeEvent(QResizeEvent *event); 
}; 

CMaze.cpp

CMaze::CMaze(QObject *root,QQmlApplicationEngine *engine) 
{ 
    this->root = root; 
    this->engine = engine; 
    /* + Some other functionality*/ 
} 
void CMaze::resizeEvent(QResizeEvent *event) 
{ 
    qDebug() << "resize event entered"; // NEVER WRITTEN to CONSOLE WHEN RESIZING 
} 

EDIT:

main.qml:

ApplicationWindow { 
    visible: true 
    width: 640 
    height: 480 
    title: qsTr("The Maze") 

    Rectangle{ 
     id: background 
     objectName: "background" 
     anchors.fill: parent 
     color: "#ffffcc" 
    } 
} 
+0

Zuerst vergessen Sie nicht 'Q_OBJECT' Makro in der' CMaze-Erklärung. Versuchen Sie als zweites, 'override' (nur seit C++ 11) Schlüsselwort auf' resizeEvent' zu verwenden: Haben Sie sich nicht geirrt? – ilotXXI

+0

Leider ist das Verhalten immer noch dasselbe, mit '' 'Q_OBJECT''' Makro und hinzugefügt' '' override''' Schlüsselwort. –

+0

@ilotXXI: Er braucht 'Q_OBJECT' hier nicht. –

Antwort

2

Sie deklarieren 2 Fenster: die Qwindow im C++ Code (die Sie die „falsche“ Fenster sind nennen), die auf Ihre QML völlig unabhängig ist, und die Application in Ihrem QML, die nicht hat Größenänderungs-Handler. Sie sollten diese 2 Fenster zusammenführen. Ich schlage vor, Ihnen folgenden Refactoring, basierend auf der Klasse QQuickView, die ein Fenster mit einer integrierten QML-Engine ist:

CMaze.h:

class CMaze: public QQuickView 
{ 
public: 
    /* QQuickView already has a QML engine and a root object */ 
    CMaze(/*QObject *root, QQmlApplicationEngine *engine*/); 
private: 
    // QObject *root; 
    // QQmlApplicationEngine *engine; 

    /*+ Some other variables*/ 

protected: /* respect inherited scope */ 
    /* use override to prevent misdeclaration*/ 
    void resizeEvent(QResizeEvent *event) override; 

};

CMaze.cpp:

CMaze::CMaze(/*QObject *root,QQmlApplicationEngine *engine*/) 
{ 
    //this->root = root; /* replaced by this->rootObject() */ 
    //this->engine = engine; /* replaced by this->engine() */ 

    /* + Some other functionality*/ 
} 
void CMaze::resizeEvent(QResizeEvent *event) 
{ 
    qDebug() << "resize event entered"; 
} 

main.cpp:

int main(int argc, char *argv[]) 
{ 
    QCoreApplication::setAttribute(Qt::AA_EnableHighDpiScaling); 
    QGuiApplication app(argc, argv); 
    // QQmlApplicationEngine engine; 
    // engine.load(QUrl(QLatin1String("qrc:/main.qml"))); 
    // QObject *root = engine.rootObjects().first(); 
    CMaze maze; //(root,&engine); 
    /* set QML source on maze */ 
    maze.setSource(QUrl(QLatin1String("qrc:/main.qml"))); 
    /* show the view */ 
    maze.show(); 
    return app.exec(); 
} 

main.qml:

// you already have the window: just keep the rectangle 
Rectangle{ 
    id: background 
    objectName: "background" 
    anchors.fill: parent 
    color: "#ffffcc" 
} 
Verwandte Themen