2

使用自定义 QT C++ 代码显示 QML 文件的最佳方式是什么?我尝试创建一个没有窗口边框的 QWidget

主文件

#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 实现窗口边框?

4

1 回答 1

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;
    }
}
于 2010-12-17T16:17:08.810 回答