Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ QQuickWidget自定义大小调整模式_C++_Qt_Qml_Resize_Qquickwidget - Fatal编程技术网

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