在Qml scaleChanged上缩放QGraphicsProxyWidget

时间:2014-12-04 16:17:08

标签: qt qt4 qml qgraphicsview qt-quick

我在现有应用程序中使用QCustomPlot库(基于QWidget的绘图库),该应用程序主要由QDeclarativeView UI组成。

我从QGraphicsProxyWidget派生了一个QmlPlot类,我通过插件向Qml公开,然后我用setWidget()方法插入QCustomPlot Widget。

这非常好用,我可以在qml中实现它。

Item {
    id: plotAnchor
    anchors.top: iMainCourbe.top
    anchors.bottom: iMainCourbe.bottom
    anchors.left: iMainCourbe.left
    anchors.right: iMainCourbe.right
    QmlPlot {
        id: qcpproxy
        anchors.fill: plotAnchor
        //otherstuff
        rootScale: automate.scale
    }
    Rectangle {
        id: borders
        anchors.fill: plotAnchor
        color: "transparent"
        border.color: "red"
        border.width: 2
    }
}

这是包含其他几个子组件的更大组件的一部分。

这是模拟项目的一部分。我们想要模拟数字录音机。 所有尺寸(以及字体大小,边框宽度等)都在所述数字记录器的规格中明确定义,因此我决定给根部件固定的高度和宽度对应于数字记录器屏幕的分辨率。 这样我们就可以根据规范设置qml子组件的所有维度,比例也很完美。

但是,我需要在最后显示qml组件以进行缩放(1:1),因此根据显示屏尺寸(计算机)及其dpi使用一些计算,我比例使用其scale属性的根项目,以实现此1:1比率。

DigitalRecorder.qml

BaseComponent {
    id: iMain

    width: 320
    height: 240
    scale: someFunction()
}

这适用于所有基于qml的组件,但对于QGraphicsProxyWidget,它看起来非常像素化。 根据我从调试器中收集的内容,QPixmap缓冲区大小不会缩放,也不是小部件的视口。 Widget继续绘制在同一个小表面上,然后Qml缩放(差)。

我尝试了什么:

我忽略了QGraphicsProxyWidget上的转换。 然后我用手动计算的缩放尺寸手动调用QGraphicsWidget::resize(),并且在图像质量方面我得到了更好的结果,因为 QPixmap缓冲区和包含的窗口小部件的视口相应调整大小

QmlPlot::QmlPlot(QDeclarativeItem *parent):
    QGraphicsProxyWidget(parent),
    m_rtplot(NULL)
{
    connect(parentItem(), SIGNAL(scaleChanged()), SLOT(rescaleFromQml())); // This cannot work because parentitem() is null here and moreover scaleChanged() isn't emmited byt the children of the root item when the root item is scaled.. 
    setFlag(QGraphicsItem::ItemIgnoresTransformations, true); // this ignores scaling

    m_rtplot = new RealTimeCustomPlot();
    setWidget(m_rtplot);
    setVisible(true);
}

void QmlPlot::rescaleFromQml()
{
  resize(parentObject()->sceneBoundingRect().size());   
}

必须有更好的方法来实现这一目标,所以我的问题是:

如何让我的QGraphicsProxyWidget对根项目的缩放做出反应? 我应该在什么事情上做出反应?在哪个事件处理程序?

更新1:

我将rescaleFromQml()中的非感觉编辑得更好了。

重新解释我的整个问题:而不是手动将一些信号连接到我的rescaleFromQml()方法,我应该把它放在哪个事件处理程序中?并对哪个事件做出反应?

0 个答案:

没有答案