Anzeige der QML-Datei mit benutzerdefinierten QT-Code (Implementierung Größe ändern / Verschieben-Funktionalität)

StackOverflow https://stackoverflow.com/questions/4471456

  •  11-10-2019
  •  | 
  •  

Frage

Was ist der beste Weg, um eine QML-Datei mit benutzerdefinierten QT C ++ Code der Anzeige? Ich versuchte, einen QWidget ohne Fensterrahmen zu schaffen wie

main.cpp

#include "stdafx.h"
#include "myqmlapp.h"
#include <QtGui/QApplication>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    MyQMLApp w(NULL, Qt::CustomizeWindowHint | Qt::FramelessWindowHint);
    w.show();
    return a.exec();
}

myqmlapp.cpp

MyQMLApp::MyQMLApp(QWidget *parent, Qt::WFlags flags)
    : QWidget(parent, flags), qmlView(this)
{
    QApplication::instance()->connect(qmlView.engine(), SIGNAL(quit()), SLOT(quit()));

    qmlView.setSource(QUrl("qrc:test1.qml"));
    qmlView.show();

    ui.setupUi(this);
}

Und meine Anwendungsfenster ist das Widget. Das einzige, was sichtbar ist die Ausgabe meiner QML-Datei. Das hat aber einige Probleme. Da ich mich nicht Größe ändern / Verschieben tun kann, keine Fensterränder habe.

Wie kann ich einen Fensterrahmen mit QML implementieren?

War es hilfreich?

Lösung

Sie können sie manuell schreiben. Zum Beispiel Ereignisse fangen Maus, bestimmen Klick Region, und die Arbeit mit ihm, als ob es Fenster Kopf- oder Grenze war. Alle Koordinaten in der Y-Koordinate kleiner als 30 kann „Header“ -Region, die alle innerhalb von 5 Pixeln nahe Widget Kante sein kann „border“ Region usw. Nach dass reimplementieren Mausereignissen, wie mousemove fangen, mouseClickEvent etc zu tun, was Sie an aktueller Maus Region brauchen stützen.

Ein Stück Code, das Fenster zu bewegen.

typedef enum WidgetRegion {HEADER_REGION, BORDER_REGION, ... } WidgetRegion;

windowlessWidget::windowlessWidget(QWidget* parent):QWidget(parent)
{
...
setMouseTracking (true);

}

WidgetRegion windowlessWidget::calculateWindowRegion(QPoint mousePos)
{
  ...
  return region;
}
void windowlessWidget::mousePressEvent(QMouseEvent* event)
{
    if(calculateWindowRegion(event->pos())==HEADER_REGION)
    if(event->button() == Qt::LeftButton)
    {
        mMoving = true;
        mLastMousePosition = event->globalPos();
    }
}

void windowlessWidget::mouseMoveEvent(QMouseEvent* event)
{
    if(calculateWindowRegion(event->pos())==HEADER_REGION)
     if( event->buttons().testFlag(Qt::LeftButton) && mMoving)
     {                                  //offset
         window()->move(window()->pos() + (event->globalPos() - mLastMousePosition));
         mLastMousePosition = event->globalPos();
     }
}

void windowlessWidget::mouseReleaseEvent(QMouseEvent* event)
{
    if(calculateWindowRegion(event->pos())==HEADER_REGION)
    if(event->button() == Qt::LeftButton)
    {
        mMoving = false;
    }
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top