Отображение файла QML с пользовательским кодом QT (реализация функции изменения размера / перемещения) - PullRequest
2 голосов
/ 17 декабря 2010

Каков наилучший способ отображения файла 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 Ответ

2 голосов
/ 17 декабря 2010

Вы можете написать их вручную.Например, отлавливать события мыши, определять область щелчка и работать с ней, как если бы это был заголовок окна или граница.Все координаты, где координата 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;
    }
}
...