c++ - Qt QGraphicsScene 添加和删除线条

标签 c++ qt

我是 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,我尝试了 QGraphicsItemQGraphicsScene 组合,但这不是我想要继续的方式。我不知道如何将线(轴)添加为变量或指针,然后使用它在场景中添加/删除。谁能告诉我怎么做?


[编辑] 抱歉,忘了说我希望能够在不影响已经绘制的内容的情况下切换它们。

最佳答案

如果你有固定数量的行,你可以将它们存储为成员变量,问题就变得微不足道了。但我假设行数可能会有所不同。我还假设您希望显示/隐藏的每一行都有一个单独的复选框。你想做的是使用 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/

相关文章:

c++ - wxFreeChart 值标签图表

Qt3D "qt.glx: qglx_findConfig: Failed to finding matching FBConfig"警告

c++ - QAudioDeviceInfo 在 Ubuntu 上找不到默认音频设备

python - QTimer 与超时方法的连接在测试用例 (Python) 中不起作用

c++ - 如何在 Qt 的子窗口小部件中忽略父窗口小部件的工具提示?

c++ - Qt:将包含二维数组的信号从一个线程传递到另一个线程

c++ - 监视表达式中的 vector 大小不正确

c++ - 使用非类型可变参数模板的运行时计算

c++ - C++:在数组中输入数字时,第一个数字为0

c++ - 如何从手动矩阵操作中推断平移、剪切等?