2016-08-03 172 views
1

我是(非常)新的Qt,我试图做一个简单的情节(不涉及外部库& co),它也有一个框,轴和网格线,我想要能够切换。Qt QGraphicsScene添加和删除行

我有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,组合,但这不是我想要继续的方式。我不知道如何将行(轴)作为变量或指针添加,然后使用它添加/删除/从场景中。有人可以告诉我该怎么做吗?


[编辑] 对不起,忘了说我希望能够切换它们不会影响什么的已经绘制的。

回答

2

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

谢谢你的回答。我复制粘贴代码以获得它的感觉,但是使用Qtcreator 4.0.3,Qt 5.7.0,arch x64,它说'未定义引用'Widget'的vtable。我加了'C++ 11'这一行,但是确实如此。我不得不评论最后一个'.moc'行,'没有这样的文件或目录'。这是原因吗?另外,设想一个绘图窗口,它具有XY轴,可配置的网格线数量,以及一个框,一个矩形,以适应所有的情况。这些我想添加/删除而不触及已经绘制的线条,因此它们的数量是固定的。也许这有帮助? –

+0

@aconcernedcitizen先运行qmake,然后尝试构建。 – thuga

+0

然后,您可以将它们中的大部分存储为成员变量,并将信号连接到插槽并隐藏/显示该插槽中的信号。所以你不必像我在例子中那样使用'QVector'。您也可以使用插槽而不是lambda表达式。只需为每个显示/隐藏内容的复选框创建一个插槽即可。 – thuga