2016-08-03 8 views
0

Это продолжение с Qt QGraphicsScene add and delete lines. Я думал, что смогу это сделать, но не могу. Появится окно, но независимо от того, сколько раз я проверяю/снимаю галочку, оси отображаются только один раз и никогда не скрываются или не переключаются; они остаются после первой проверки «на».Qt QGraphicsScene показать/скрыть оси

Я добавил qDebug(toggled ? "1" : "0"), он правильно показывает значение, toggled «s меняющегося от 0 к 1 и наоборот за каждый клик по флажку, но ось только остаться после того, как они включены. Я только начал Qt около недели назад (и C++ около месяца назад), на данный момент я не знаю, чему верить.

В связанном вопросе thuga использует connect() внутри цикла и только заботится о одной строке, но эта одна строка переключается. Я также попытался сделать функцию bool, возвращая toggled, но это то же самое. Как будто setVisible(false) не работает.

Вот что у меня есть (заменить х переменных с тем, что вы хотите):

[открытый слот]

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 является QCheckBox, и его connect() функции:

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

, где PlotBox - класс. Кроме того, есть также boxToggle и gridToggle, но нет смысла идти вперед, если это не сработает.


[править]

Чтобы лучше показать, что у меня есть, вот скриншот приложения: qtapp

Он начал, пытаясь QGraphicsView с простым sinc(), а затем перешли к Октава stem-подобный сюжет, затем я продолжал добавлять к практике Qt (я только изучаю его) - пока не просматривайте странные пунктирные линии сетки. В настоящее время он автоматически обновляет график после любого +/- щелчка на спинбоксах sinc() settings или выбирает Plot style, у него есть ключевой ярлык для переключения сглаживания, он может увеличиваться с Ctrl+MouseWheel, можно корректно сбросить представление. Итак, теперь я подумал, что добавлю возможность переключить сетку & co, а также разрешая настройку линий сетки.

Теперь мне удалось получить результаты, отказавшись от функции общего слота и сделав connect(), как и в предыдущем ответе. Это внутри конструктора PlotBox() (PlotBox является классом).

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

и она работает только если Х переменных простые значения (как в int a {value}), но они зависят от sinc() settings spinboxes; Я использую orderN = orderSet->value() для установки N, который используется, например, для вычисления переменных xy. Таким образом, вышеизложенное будет работать, только если я не внес изменения в сюжет.

Если я хочу, чтобы они были синхронизированы с sinc() settings, то я должен сделать это следующим образом:

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

и это также будет работать, но только если я не делаю каких-либо изменений в любой из sinc() settings спинбоксами. Если я это сделаю, и я попытаюсь переключить оси, он сработает, потому что xMin & co динамически используются функциями Plot style, когда они вызываются - каждый из них модифицирует значения локально. Это приводит к несоответствию значений.

Так что, если это нужно только адаптировать значения spinboxes, то я преобразовал его в функцию для него, в одиночку, как это:

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

, который я назвал с connect() как это:

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

Этот номер использует тот же самый xAxis->setVisible(toggle), как указано выше, но он не работает. Он будет показывать только оси, когда установлен флажок Axes, затем они остаются включенными до тех пор, пока я не вношу изменения в сюжет, тогда они снова могут быть переключены, но это все.

Всего main.cpp около 370 строк. Если это необходимо, я могу опубликовать его в pastebin. Это, скорее всего, самый детский код, который вы когда-либо увидите, но я просто изучаю.

ответ

0

мне удалось решить эту проблему, сделав xAxis и yAxis частных переменными, а затем с помощью функции-члена updateValues() дела со всеми необходимыми другими переменными, а также, функцией, которая вызывается каждым из частных функций игровых plotImpulses(), plotLines() и plotSteps(), таким образом, повторное использование значений, а затем удерживая connect() как:

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

в конце конструктора, после чего мне нужно только позвонить стиль по умолчанию участок (plotImpulses()) для того, чтобы значения, которые будут обновлены , Это должно произойти только один раз с конструктором (справа?). Теперь, когда есть изменения в сюжете, updateValues() вызывается через функции стиля сюжета, что означает, что переключение осей (+ коробка + сетка) выполняется со свежими обновленными значениями из спинбокс. Я не уверен, насколько ортодоксально это то, что я сделал, или сколько накладных расходов или возможностей для оптимизации есть, поэтому предложения приветствуются.

Смежные вопросы