2016-08-03 12 views
1

Ich bin (sehr) neu zu Qt und ich versuche, ein einfaches Diagramm (ohne Einbeziehung externer Bibliotheken & co), die auch eine Box, Achsen und Rasterlinien, die ich will umschalten zu können.Qt QGraphicsScene Hinzufügen und Löschen von Zeilen

Ich habe die QGraphicsScene als scene definiert, wo ich scene->addLine(...) verwenden kann, aber ich weiß nicht, wie ich diese Zeilen auf einem QCheckBox basierend entfernen kann. Dies ist (kurz), was ich in der Funktion plotAxes() gesetzt haben, die mit connect() verwendet wird:

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(); 
    } 

Der Code zeigt nur die erste Achse, wenn es für das funktioniert kann ich alles andere erweitern, aber es funktioniert nicht. Bei xAxis habe ich versucht QGraphicsItem, QGraphicsScene, Kombinationen, aber das ist nicht, wie ich fortfahren möchte. Ich weiß nicht, wie man die Linie (Achse) als Variable oder Zeiger hinzufügt und diese dann zum Hinzufügen/Löschen zu/von der Szene verwendet. Kann mir bitte jemand sagen, wie es geht?


[Bearbeiten] Es tut mir leid, zu sagen, ich habe vergessen, sie in der Lage sein wollen, zu wechseln, ohne zu beeinflussen, was bereits ist aufgetragen.

Antwort

2

Wenn Sie eine feste Anzahl von Zeilen haben, können Sie sie als Elementvariablen speichern und das Problem wird trivial. Aber ich gehe davon aus, dass die Anzahl der Zeilen variieren kann. Ich gehe auch davon aus, dass Sie für jede Zeile, die Sie ein-/ausblenden möchten, ein eigenes Kontrollkästchen haben. Was Sie tun möchten, ist das toggled Signal Ihrer Checkboxen, um Ihre Linien zu verstecken/zu zeigen. Sie können dazu eine QSignalMapper verwenden, aber ich empfehle, einen Lambda-Ausdruck zu verwenden.

Ich lege ein Beispiel, dass Sie einfach kopieren und einfügen und ausführen können. In diesem Beispiel habe ich einen Lambda-Ausdruck verwendet, der c++11 erfordert. Wenn Sie Qt 5.7 (oder neuer für zukünftige Referenz) verwenden, denke ich, dass es automatisch aktiviert wird. Aber wenn Sie eine ältere Version verwenden, müssen Sie CONFIG += c++11 in Ihrer .pro Datei hinzufügen.

#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

Vielen Dank für die Antwort. Ich habe den Code kopiert, um ein Gefühl dafür zu bekommen, aber mit Qtcreator 4.0.3, Qt 5.7.0, arch x64, steht 'undefinierter Verweis auf 'vtable for Widget''. Ich habe zwar die Zeile 'C++ 11' hinzugefügt, aber es ist dasselbe. Ich musste die letzte '.moc' Zeile kommentieren,' keine solche Datei oder kein Verzeichnis'. Ist das der Grund? Stellen Sie sich auch ein Plot-Fenster vor, das XY-Achsen, eine konfigurierbare Anzahl von Rasterlinien und eine Box, ein Rechteck, für alle Elemente enthält. Diese möchte ich hinzufügen/löschen ohne die bereits geplotteten Zeilen zu berühren, damit sind sie fest in der Anzahl. Vielleicht hilft das? –

+0

@aconcernedcitizen Führen Sie zuerst qmake aus, dann versuchen Sie es zu bauen. – thuga

+0

Dann können Sie die meisten von ihnen nur als Mitgliedsvariablen speichern, und ein Signal an einen Slot anschließen und die in diesem Slot verstecken/anzeigen. Sie müssen also keinen 'QVector' verwenden, wie ich es im Beispiel getan habe. Sie können anstelle von Lambda-Ausdrücken auch Slots verwenden. Machen Sie einfach einen Platz für jedes Kontrollkästchen, das etwas zeigt/versteckt. – thuga