QML动态创建工具提示

时间:2017-10-09 14:41:24

标签: javascript qml tooltip qtquick2 qtquickcontrols2

所以我有一个动态变化的饼图。我想在鼠标悬停在切片上时显示每个切片的值,但是我不确定如何在触发onHovered时创建工具提示。我用

  

qt 5.9.1&导入QtQuick.Controls 2.2

更新:我添加了一些代码来解释如何创建切片。 这是代码:

function onUpdateValues(values){
     switch(values.type){
           case PIE_CHART: 
                createPieChart(values.data);
                break;
           ...
           default:
                console.debug("CHART TYPE ERROR");
                break;
            }
     }
}

function createPieChart(data){
    pieserieschart.clear();
    for (var prop in data) {
        var new_slice =  pieserieschart.append(prop, data[prop]);
        new_slice.tooltip = prop + ": " + data[prop]
        //I tried using hovered signal (and without), but it's not doing any difference
        new_slice.hovered.connect(function(state) { new_slice.tooltip.visible = state })
        //If I replace the above line by the next one, I can see the console.log info, but the tooltip is not enabled
        new_slice.hovered.connect(function(state) { sliceHovered(new_slice, state) })

    }
}

function sliceHovered(slice, value){
    slice.enabled = true
    console.log("Slice hovered: " + slice.tooltip + " " + value)
}

ChartView { /* Chart */
    id:chartView

    PieSeries {
       id: pieserieschart;
       size: 1;
       holeSize: 0.55;
       onClicked: sliceClicked(slice);
    }
}

我可以看到console.log但是我无法看到工具提示,并且应用程序输出没有显示任何错误,但工具提示未被触发

2 个答案:

答案 0 :(得分:3)

相关文档:

示例:

ChartView {
    id: chartView

    PieSeries {
        onHovered: {
            if (state)
                chartView.ToolTip.show(slice.label + ":" + slice.value)
            else
                chartView.ToolTip.hide()
        }
    }
}

答案 1 :(得分:1)

我知道您也许不再需要这个了,但是由于我遇到了同样的问题并遇到了这个问题,因此我将解决方案发布到切片上的位置。

首先,我没有使用chartView.ToolTip,因为它不允许我在飞机上移动...所以我制作了一个ToolTip {}元素,可见性= false。

高中数学现在变得值得。 PieSlice具有2个有用的属性:startAngle(在饼开始的圆上)和angleSpan(饼使用的角度)。有了角度,我可以使用一些数学魔术来找到X和Y。

棘手的零件:角度为顺时针方向,几何对象为逆时针方向。因此,我必须先将角度从顺时针转换为逆时针...而且几何的起点与Qt图表不同,我必须通过从原点减小-90来进行补偿...

因为我希望在切片的中间显示提示,所以我将angleSpan的一半与startAngle相加。

经历了很多苦难之后,我意识到Math.cos和Math.sin使用的是RADIANS中的输入,而不是度数。我从角度转换为弧度,...就这样。我希望这可以帮助像我一样迷路的其他人=)。

      ToolTip{
        id:sliceToolTip
        visible: false;


    }
         onHovered: {
            if (state){


             // 360 + angle clockwise to convert to counter-clw.
             //-90 to compensate the QML charts start point 
                var angle =(360+ (-1*(slice.startAngle-90+(slice.angleSpan/2))));
                if(angle > 360){ //Reduce to one spin, preventing high angles
                  angle -=360;
                }
                angle = (angle*Math.PI)/180; //convert to radians


                var offsetX = Math.cos(angle);
                var offsetY = Math.sin(angle);
                 sliceToolTip.x =  (chartView.width/2 - (sliceToolTip.width/2)) +  ((chartView.width/16)* offsetX*3);
                 sliceToolTip.y = (chartView.height/2 - (sliceToolTip.height/2)) - ((chartView.height/9)*offsetY*3); // My screen is 16:9, so I made a proportion to match the circle, as my charts goes with anchors.centerIn: parent
            }
                     else{
                        sliceToolTip.hide()
            }
        }