这是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();
}
axesToggle
是QCheckBox
,其connect()
功能是:
connect(axesToggle, &QCheckBox::toggled, this, &PlotBox::plotAxes);
其中PlotBox
是该类。此外还有boxToggle
和gridToggle
,但如果这不起作用,那么前进是没有意义的。
[编辑]
首先尝试使用简单的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。它很可能是你见过的最幼稚的代码,但我只是在学习。
答案 0 :(得分:0)
我设法通过创建xAxis
和yAxis
私有变量来解决这个问题,然后使用成员函数updateValues()
处理所有必要的其他变量,以及调用的函数每个私有广告位功能plotImpulses()
,plotLines()
和plotSteps()
,从而重用这些值,然后将connect()
保持为:
connect(axesToggle, \
&QCheckBox::toggled, \
[=](bool toggled)
{
xAxis->setVisible(toggled);
yAxis->setVisible(toggled);
});
在构造函数的末尾,之后我只需要调用默认的绘图样式(plotImpulses()
)以便更新值。这应该只发生一次构造函数(对吗?)。现在,只要图中有变化,updateValues()
就会通过绘图样式函数调用,这意味着切换轴(+框+网格)是使用来自旋转框的新更新值完成的。我不确定我做了多么正统,或者有多少开销或优化空间,所以建议最受欢迎。