2016-08-03 10 views
0

Dies ist eine Fortsetzung von Qt QGraphicsScene add and delete lines. Ich dachte, ich könnte es, aber ich kann nicht. Das Fenster erscheint, aber egal, wie oft ich das Häkchen ein/auschecke, die Achsen erscheinen nur einmal und werden nie versteckt oder umgeschaltet; Sie bleiben nach dem ersten "An" Check an.Qt QGraphicsScene zeigen/verbergen Achsen

Ich habe ein qDebug(toggled ? "1" : "0"), es richtig die toggled ‚s-Wert zeigt 0-1 und umgekehrt für jeden Klick auf das Kontrollkästchen zu ändern, aber die Achsen nur bleiben, nachdem sie eingeschaltet sind. Ich habe Qt erst vor einer Woche angefangen (und C++ vor ungefähr einem Monat), zu diesem Zeitpunkt weiß ich nicht, was ich glauben soll.

In der verknüpften Frage verwendet thuga die connect() innerhalb der Schleife und kümmert sich nur um eine Zeile, aber diese eine Zeile wird umgeschaltet. Ich habe auch versucht, die Funktion bool, toggled zurückgeben, aber es ist die gleiche Sache. Es ist, als ob setVisible(false) nicht funktioniert.

Hier ist, was ich habe (ersetzen xy Variablen mit, was Sie wollen):

[public slot]

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 ist ein QCheckBox und seine connect() Funktion ist:

connect(axesToggle, &QCheckBox::toggled, this, &PlotBox::plotAxes); 

wobei PlotBox die Klasse ist. Darüber hinaus gibt es auch boxToggle und gridToggle, aber es macht keinen Sinn vorwärts zu gehen, wenn das nicht funktioniert.


[Bearbeiten]

besser zeigen, was ich habe, ist hier ein Screenshot der App: qtapp

Es indem man versucht, QGraphicsView mit einem einfachen sinc() begann, wechselte dann zu einer Oktave auf stem -ähnliche Handlung, dann habe ich ständig Qt hinzugefügt (ich lerne gerade erst) - ignoriere die seltsamen Gitterlinien für den Moment. Was es derzeit tut, ist es automatisch aktualisiert die Handlung nach jedem +/- Klick auf die sinc() settings Spinboxen, oder die Auswahl der Plot style, hat es eine Tastenkombination zum Umschalten Antialiasing, kann es mit Ctrl+MouseWheel zoomen, kann die Ansicht korrekt zurücksetzen. So, jetzt dachte ich, ich würde die Möglichkeit hinzufügen, das Raster & co, während auch eine Einstellung für die Rasterlinien zu ermöglichen.

Jetzt habe ich es geschafft, Ergebnisse zu bekommen, indem ich auf die öffentliche Slot-Funktion aufgegeben habe und connect() als Thuga in der vorherigen Antwort gemacht habe. Dies ist innerhalb des PlotBox() Konstruktors (PlotBox ist die Klasse).

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

und es funktioniert nur, wenn die xy-Variablen einfache Werte sind (wie in int a {value}), aber sie sind abhängig von den sinc() settings Spinnboxen; Ich benutze orderN = orderSet->value() für die Einstellung N, die zum Beispiel verwendet wird, um die XY-Variablen zu berechnen. Das obige funktioniert nur, wenn ich keine Änderungen am Plot mache.

Wenn ich will, dass sie mit dem sinc() settings synchron sein, dann muss ich es so machen:

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

und dies wird auch funktionieren, aber nur, wenn ich zu einem machen jede Änderung nicht der sinc() settings Spinboxen. Wenn ich das tue und versuche, die Achsen umzuschalten, stürzt es ab, weil & Co dynamisch von den Plot style Funktionen verwendet werden, wenn sie aufgerufen werden - sie ändern die Werte lokal. Dies führt zu einer Wertabweichung.

Also, wenn es nur die Spinnboxen Werte anpassen muss, dann verwandelt ich es in eine Funktion für sie, allein, wie folgt aus:

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

, die ich mit connect() wie folgt aufgerufen:

connect(axesToggle, &QCheckBox::toggled, [=](bool toggled){plotAxes(toggled);}); 

Dieser verwendet das gleiche xAxis->setVisible(toggle) wie oben, aber es funktioniert nicht. Es werden nur die Achsen angezeigt, wenn das Kontrollkästchen Axes aktiviert ist, dann bleiben sie eingeschaltet, bis ich Änderungen am Plot vorgenommen habe, dann können sie wieder eingeschaltet werden, aber das war's.

Das ganze main.cpp ist etwa 370 Zeilen lang. Wenn es nötig ist, kann ich es in Pastebin posten. Es ist wahrscheinlich der kindischste Code, den Sie jemals sehen werden, aber ich lerne nur.

Antwort

0

konnte ich diese xAxis und yAxis private Variablen, indem sie, so lösen, mit allen notwendigen anderen Variablen mit einer Elementfunktion updateValues() tun hat, als auch, Funktion, die plotImpulses(), die von jedem der privaten Slot-Funktionen aufgerufen wird plotLines() und plotSteps(), damit die Werte wiederverwendet, und dann die connect() wie halten:

connect(axesToggle, \ 
      &QCheckBox::toggled, \ 
      [=](bool toggled) 
      { 
       xAxis->setVisible(toggled); 
       yAxis->setVisible(toggled); 
      }); 

am Ende des Konstrukteurs, nach dem ich die Werte für nur brauchen, um die Standard-Plot-Stil (plotImpulses()) aufrufen, um aktualisiert werden . Dies sollte nur einmal mit dem Konstruktor geschehen (richtig?). Jetzt, wenn es eine Änderung im Plot gibt, wird updateValues() durch die Plot-Style-Funktionen aufgerufen, was bedeutet, dass das Umschalten der Achsen (+ Box + Gitter) mit frischen aktualisierten Werten aus den Spinboxen erfolgt. Ich bin mir nicht sicher, wie orthodox es ist, was ich gemacht habe, oder wie viel Aufwand oder Spielraum für Optimierung vorhanden ist, daher sind Vorschläge sehr willkommen.