2016-08-03 3 views
1

저는 (매우) Qt를 처음 사용하고 있으며, 원하는 플롯의 상자, 축 및 그리드 선이있는 외부 플롯 (외부 라이브러리 &)을 사용하지 않고 간단한 플롯을 만들려고합니다. 토글 할 수 있습니다. Qt QGraphicsScene 추가 및 삭제 줄

은 내가 scene->addLine(...)를 사용할 수있는 곳 QGraphicsScenescene으로 정의해야하지만 나는 내가 QCheckBox에 따라 그 라인을 제거 할 수있는 방법을 모르겠어요. 이것은 내가 connect()로 사용되는 기능 plotAxes()에서 설정 한 것 (짧은)입니다 :

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을 사용하면되지만 람다 식을 사용하는 것이 좋습니다.

아래 예제를 복사하여 붙여 넣기하고 실행할 수 있습니다. 이제이 예제에서 람다 식을 사용했습니다.이 식에는 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에서는 'vtable for widget'에 대한 정의되지 않은 참조가 있습니다. 확실히'C++ 11' 라인을 추가 했는데도 마찬가지입니다. 나는 마지막'.moc' 라인을'no such file or directory'라고 주석해야했습니다. 이것이 원인인가? 또한 XY 축, 구성 가능한 그리드 선 수 및 모두에 적합한 상자, 사각형이있는 플롯 창을 상상해보십시오. 이것들은 이미 플롯 된 선을 만지지 않고도 추가/삭제되기를 원하므로 번호가 고정되어 있습니다. 어쩌면이게 도움이 될까요? –

+0

@aconcernedcitizen 먼저 qmake를 실행 한 다음 건물을 시험해보십시오. – thuga

+0

그런 다음 대부분의 멤버 변수를 멤버 변수로 저장하고 신호를 슬롯에 연결하고 해당 슬롯의 신호를 숨기거나 표시 할 수 있습니다. 예에서했던 것처럼 QVector를 사용할 필요가 없습니다. 람다 식 대신 슬롯을 사용할 수도 있습니다. 당신이 가지고있는 모든 체크 박스를위한 슬롯을 만들거나 숨 깁니다. – thuga

관련 문제