Отображение файла QML с пользовательским кодом QT (реализация функции изменения размера / перемещения)
Каков наилучший способ отображения файла QML с пользовательским кодом QT C++? Я попытался создать QWidget без рамки окна, как
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);
}
И окно моего приложения - это виджет. Таким образом, единственное, что видно, это вывод моего файла QML. Но это имеет некоторые проблемы. Поскольку у меня нет границы окна, я не могу изменить размер / переместить.
Как я могу реализовать границу окна с QML?
1 ответ
Вы можете написать их вручную. Например, отлавливать события мыши, определять область щелчка и работать с ней, как если бы это был заголовок окна или граница. Все координаты, у которых координата y меньше 30, могут быть областью "заголовка", все в пределах 5 пикселей возле края виджета могут быть областью "границы" и т. Д. После этого переопределить события захвата мыши, такие как mouseMoveEvent,mouseClickEvent и т. Д., Чтобы сделать то, что вам нужно, на основе на текущей области мыши.
Кусок кода, который перемещает окно.
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;
}
}