我是 Qt 的(非常)新手,我正在尝试制作一个简单的绘图(不涉及外部库和合作伙伴),它还有一个框、轴和网格线,我希望能够切换它们。
我将 QGraphicsScene
定义为 scene
,我可以在其中使用 scene->addLine(...)
,但我没有知道如何根据 QCheckBox
删除这些行。这是(简而言之)我在函数 plotAxes()
中设置的,它将与 connect()
一起使用:
QGraphicsLineItem *xAxis {new QGraphicsScene::addLine(xMin, 0, xMax, 0, *dashedLine)};
if (boxToggle->isChecked())
{
scene->addItem(xAxis);
//scene->addLine(yCenter, yMin, yCenter, yMax, *dashedLine);
scene->update();
}
else
{
scene->removeItem(xAxis);
scene->update();
}
代码只显示第一个轴,如果它适用,我可以扩展到其他所有内容,但它不起作用。对于 xAxis
,我尝试了 QGraphicsItem
、QGraphicsScene
组合,但这不是我想要继续的方式。我不知道如何将线(轴)添加为变量或指针,然后使用它在场景中添加/删除。谁能告诉我怎么做?
[编辑] 抱歉,忘了说我希望能够在不影响已经绘制的内容的情况下切换它们。
最佳答案
如果你有固定数量的行,你可以将它们存储为成员变量,问题就变得微不足道了。但我假设行数可能会有所不同。我还假设您希望显示/隐藏的每一行都有一个单独的复选框。你想做的是使用 toggled
您的复选框信号隐藏/显示您的台词。您可以使用 QSignalMapper
来执行此操作,但我建议使用 lambda 表达式。
我在下面举了一个例子,你可以复制粘贴并运行。现在在这个例子中我使用了一个 lambda 表达式,它需要 c++11
。如果您使用的是 Qt 5.7 (或更新版本供将来引用),我认为它是自动启用的。但如果您使用的是旧版本,则必须在 .pro
文件中添加 CONFIG += c++11
。
#include <QApplication>
#include <QGraphicsView>
#include <QLayout>
#include <QCheckBox>
#include <QGraphicsLineItem>
class Widget : public QWidget
{
Q_OBJECT
public:
Widget()
{
resize(600, 400);
setLayout(new QVBoxLayout);
view = new QGraphicsView;
scene = new QGraphicsScene(this);
view->setScene(scene);
layout()->addWidget(view);
for(int i = 0; i < 5; i++)
{
QGraphicsLineItem *line = scene->addLine(0, i * 20, width(), i * 20, Qt::DashLine);
lines.append(line);
QCheckBox *checkbox = new QCheckBox(QString("Show line %1").arg(i+1));
connect(checkbox, &QCheckBox::toggled, [=](bool toggled){line->setVisible(toggled);});
layout()->addWidget(checkbox);
checkbox->setChecked(true);
}
}
private:
QGraphicsView *view;
QGraphicsScene *scene;
QVector<QGraphicsLineItem*> lines;
};
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
Widget w;
w.show();
return a.exec();
}
#include "main.moc"
关于c++ - Qt QGraphicsScene 添加和删除线条,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38738603/