2010-12-17 2 views
1

QT C++ 코드로 QML 파일을 표시하는 가장 좋은 방법은 무엇입니까? 나는사용자 정의 QT 코드로 QML 파일 표시 (크기 조정/이동 기능 구현)

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); 
} 

그리고 내 응용 프로그램 창 같은 창 경계없이 위젯을는 QWidget입니다 작성했습니다. 따라서 보이는 것은 QML 파일의 출력뿐입니다. 그러나 이것은 몇 가지 문제가 있습니다. 창 테두리가 없으므로 크기 조정/이동을 할 수 없습니다.

어떻게 QML로 창 경계를 구현할 수 있습니까?

답변

2

당신은 수동으로 쓸 수 있습니다. 예를 들어 마우스 이벤트를 catch하고 클릭 영역을 결정한 다음 창 헤더 나 테두리처럼 작업합니다. y 좌표가 30보다 작은 모든 좌표는 "header"영역이 될 수 있습니다. 위젯 가장자리 근처의 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; 
    } 
}