2010-12-17 5 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

あなたは手動で書き込むことができます。 たとえば、マウスイベントを捕捉し、クリック領域を決定し、ウィンドウヘッダーまたはボーダーのように操作します。 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; 
    } 
} 
関連する問題