Это продолжение с 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
, но нет смысла идти вперед, если это не сработает.
[править]
Чтобы лучше показать, что у меня есть, вот скриншот приложения:
Он начал, пытаясь 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. Это, скорее всего, самый детский код, который вы когда-либо увидите, но я просто изучаю.