Qt QGraphicsScene显示/隐藏轴

时间:2016-08-03 12:52:08

标签: c++ qt

这是Qt QGraphicsScene add and delete lines的延续。我以为我能做到,但我做不到。窗口显示,但无论我检查/取消选中多少次,轴只显示一次,永远不会被隐藏或切换;他们在第一次“开启”检查后继续留任。

我添加了qDebug(toggled ? "1" : "0"),它正确显示toggled的值从0更改为1,反之亦然,但每次点击复选框都是如此,但是轴只在打开后才会保持打开状态。我大约一周前才开始使用Qt(大约一个月前才开始使用C ++),此时我不知道该相信什么。

在链接的问题中,thuga在循环中使用connect()并且只处理一行,但是切换了一行。我也试过创建函数bool,返回toggled,但它是一样的。好像setVisible(false)不起作用。

这就是我所拥有的(用你想要的任何东西替换xy变量):

[公共广告位]

void plotAxes()
{
    QPen *dashedLine {new QPen(QBrush(Qt::blue), 1, Qt::DashLine)};
    QGraphicsLineItem *xAxis {scene->addLine(xMin, 0, xMax, 0, *dashedLine)};
    QGraphicsLineItem *yAxis {scene->addLine(yCenter, yMin, yCenter, yMax, *dashedLine)};
    bool toggled {axesToggle->isChecked()};
    if (!toggled)
    {
        xAxis->setVisible(false);
        yAxis->setVisible(false);
    }
    else
    {
        xAxis->setVisible(true);
        yAxis->setVisible(true);
    }
    scene->update();
}

axesToggleQCheckBox,其connect()功能是:

connect(axesToggle, &QCheckBox::toggled, this, &PlotBox::plotAxes);

其中PlotBox是该类。此外还有boxTogglegridToggle,但如果这不起作用,那么前进是没有意义的。

[编辑]

为了更好地展示我的内容,这里是该应用的屏幕截图: qtapp

首先尝试使用简单的QGraphicsView sinc(),然后转到Octave的stem - 类似的情节,然后我继续添加练习Qt(我只是学习它) - 暂时忽略奇怪的虚线网格线。它目前的作用是在任意+/-点击sinc() settings旋转框后自动更新绘图,或者选择Plot style,它有一个切换抗锯齿的快捷键,它可以用{{1进行缩放},可以正确重置视图。所以现在我想我可以添加切换网格和co的可能性,同时还允许设置网格线。

现在我设法通过放弃公共广告位功能并按照上一个答案中的thuga做Ctrl+MouseWheel来获得结果。这是在connect()构造函数中(PlotBox()是类)。

PlotBox

只有当 xy变量是简单值(如QPen *dashedLine {new QPen(QBrush(Qt::blue), 1, Qt::DashLine)}; QGraphicsLineItem *xAxis {scene->addLine(xMin, 0, xMax, 0, *dashedLine)}; QGraphicsLineItem *yAxis {scene->addLine(yCenter, yMin, yCenter, yMax, *dashedLine)}; connect(axesToggle, &QCheckBox::toggled, [=](bool toggled){xAxis->setVisible(toggled); yAxis->setVisible(toggled)}); )时才会起作用,但它们依赖于int a {value}个旋转框;我使用sinc() settings来设置orderN = orderSet->value(),例如用于计算xy变量。所以只有在我不对剧情进行修改的情况下才能使用上述内容。

如果我希望它们与N同步,那么我必须这样做:

sinc() settings

这也可以,但前提是我不对任何orderN = static_cast<short>(orderSet->value()); spacingS = static_cast<short>(spacingSet->value()); plotHeight = static_cast<short>(heightSet->value()); int xMin {-spacingS}; int xMax {orderN*spacingS}; int yMin {plotHeight>>2}; int yMax {-plotHeight}; double yCenter {(orderN-1)*spacingS*0.5}; QPen *dashedLine {new QPen(QBrush(Qt::blue), 1, Qt::DashLine)}; QGraphicsLineItem *xAxis {scene->addLine(xMin, 0, xMax, 0, *dashedLine)}; QGraphicsLineItem *yAxis {scene->addLine(yCenter, yMin, yCenter, yMax, *dashedLine)}; connect(axesToggle, &QCheckBox::toggled, [=](bool toggled){xAxis->setVisible(toggled); yAxis->setVisible(toggled)}); 旋转框进行任何更改。如果我这样做并且我尝试切换轴,它会崩溃,因为sinc() settings&amp; co由xMin函数动态使用,当它们被调用时 - 它们各自在本地修改值。这会导致值不匹配。

所以,如果它只需要调整spinboxes值,那么我就把它转换成一个函数,就像这样:

Plot style

我用这样的void plotAxes(const bool &toggled) { orderN = static_cast<short>(orderSet->value()); spacingS = static_cast<short>(spacingSet->value()); plotHeight = static_cast<short>(heightSet->value()); int xMin {-spacingS}; int xMax {orderN*spacingS}; int yMin {plotHeight>>2}; int yMax {-plotHeight}; double yCenter {(orderN-1)*spacingS*0.5}; QPen *dashedLine {new QPen(QBrush(Qt::blue), 1, Qt::DashLine)}; QGraphicsLineItem *xAxis {scene->addLine(xMin, 0, xMax, 0, *dashedLine)}; QGraphicsLineItem *yAxis {scene->addLine(yCenter, yMin, yCenter, yMax, *dashedLine)}; xAxis->setVisible(toggled); yAxis->setVisible(toggled); //qDebug(toggled ? "1" : "0"); // this correctly shows "toggled" changing values scene->update(); } 打电话:

connect()

这个使用与上面相同的connect(axesToggle, &QCheckBox::toggled, [=](bool toggled){plotAxes(toggled);}); ,但它不起作用。它只会在选中xAxis->setVisible(toggle)复选框时显示轴,然后它们一直保持到我对图形进行更改,然后它们可以再次打开,但就是这样。

整个Axes长约370行。如果需要,我可以将它发布到pastebin。它很可能是你见过的最幼稚的代码,但我只是在学习。

1 个答案:

答案 0 :(得分:0)

我设法通过创建xAxisyAxis私有变量来解决这个问题,然后使用成员函数updateValues()处理所有必要的其他变量,以及调用的函数每个私有广告位功能plotImpulses()plotLines()plotSteps(),从而重用这些值,然后将connect()保持为:

    connect(axesToggle, \
            &QCheckBox::toggled, \
            [=](bool toggled)
            {
                xAxis->setVisible(toggled);
                yAxis->setVisible(toggled);
            });

在构造函数的末尾,之后我只需要调用默认的绘图样式(plotImpulses())以便更新值。这应该只发生一次构造函数(对吗?)。现在,只要图中有变化,updateValues()就会通过绘图样式函数调用,这意味着切换轴(+框+网格)是使用来自旋转框的新更新值完成的。我不确定我做了多么正统,或者有多少开销或优化空间,所以建议最受欢迎。