Anzeige der QML-Datei mit benutzerdefinierten QT-Code (Implementierung Größe ändern / Verschieben-Funktionalität)
-
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?
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;
}
}