使用自定义 QT 代码显示 QML 文件(实现调整大小/移动功能)
Posted
技术标签:
【中文标题】使用自定义 QT 代码显示 QML 文件(实现调整大小/移动功能)【英文标题】:Displaying QML file with custom QT code (implementing resize/move functionality) 【发布时间】:2010-12-17 14:34:30 【问题描述】:使用自定义 QT C++ 代码显示 QML 文件的最佳方式是什么?我尝试创建一个没有像
这样的窗口边框的 QWidgetmain.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;
【讨论】:
以上是关于使用自定义 QT 代码显示 QML 文件(实现调整大小/移动功能)的主要内容,如果未能解决你的问题,请参考以下文章
使用我的 QT5 自定义小部件调整 QGroupBox 大小
使用 Qt.createQmlObject() 创建自定义 qml 对象实例