C++ QQuickWidget自定义大小调整模式
注意:这是一个自我回答的问题。过去解决这个问题让我有些头疼,所以我觉得值得分享C++ QQuickWidget自定义大小调整模式,c++,qt,qml,resize,qquickwidget,C++,Qt,Qml,Resize,Qquickwidget,注意:这是一个自我回答的问题。过去解决这个问题让我有些头疼,所以我觉得值得分享 我有一个为高清分辨率(1366x768)设计的qml应用程序。它使用的是QtQuick.Layouts,因此适合自定义分辨率。但将其尺寸调整到低于高清分辨率会使其变得黏糊糊且毫无意义。我没有用最小大小限制QQuickWidget的大小,因为现在我正在尝试将多个小部件放置在QWidget的网格布局中。当QQuickWidget的大小小于初始大小(1366x768)时,我想缩小根项目以适应小部件。问题是QQuickWid
我有一个为高清分辨率(1366x768)设计的qml应用程序。它使用的是
QtQuick.Layouts
,因此适合自定义分辨率。但将其尺寸调整到低于高清分辨率会使其变得黏糊糊且毫无意义。我没有用最小大小限制QQuickWidget
的大小,因为现在我正在尝试将多个小部件放置在QWidget
的网格布局中。当QQuickWidget
的大小小于初始大小(1366x768)时,我想缩小根项目以适应小部件。问题是QQuickWidget
只提供了两个选项,没有一个适合我的需要。而且不可能取消激活ResizeMode
。因此,我试图禁用ResizeMode,并编写一个自定义的。这是一个丑陋但有效的解决方案。我检查了QQuickWidget
,并实现了内部函数在无效时不执行任何操作
CustomQuickWidget(QWidget* parent = nullptr)
: QQuickWidget(parent)
{
//set invalid resize mode for custom resizing
setResizeMode(static_cast<QQuickWidget::ResizeMode>(-1));
setSource(QML_SOURCE);
}
void CustomQuickWidget::resizeEvent(QResizeEvent *event) {
QQuickWidget::resizeEvent(event);
const int eventWidth = event->size().width();
const int eventHeight = event->size().height();
const int initialWidth = initialSize().width();
const int initialHeight = initialSize().height();
if (eventWidth >= initialWidth && eventHeight >= initialHeight) {
// SizeRootObjectToView
rootObject()->setSize(event->size());
rootObject()->setScale(1);
}
else {
// Scale down
const qreal widthScale = qreal(eventWidth) / initialWidth;
const qreal heightScale = qreal(eventHeight) / initialHeight;
if (widthScale < heightScale) {
// stretch height to fill
rootObject()->setWidth(initialWidth);
rootObject()->setHeight(qMin(int(eventHeight / widthScale), maximumHeight()));
rootObject()->setScale(widthScale);
}
else {
// stretch width to fill
rootObject()->setWidth(qMin(int(eventWidth / heightScale), maximumWidth()));
rootObject()->setHeight(initialHeight);
rootObject()->setScale(heightScale);
}
}
}
QSize CustomQuickWidget::sizeHint() const { return initialSize(); }
transformOrigin: Item.TopLeft