2016-08-03 179 views
1

我是(非常)新的Qt,我試圖做一個簡單的情節(不涉及外部庫& co),它也有一個框,軸和網格線,我想要能夠切換。Qt QGraphicsScene添加和刪除行

我有QGraphicsScene定義爲scene在那裏我可以使用scene->addLine(...),但我不知道我怎麼可以刪除根據QCheckBox這些行。這是(簡稱),我在功能plotAxes()將與connect()使用已設置:

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來做到這一點,但我建議使用lambda表達式。

我在下面舉了一個例子,你可以複製粘貼並運行。現在在這個例子中,我使用了一個lambda表達式,它需要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,它說'未定義引用'Widget'的vtable。我加了'C++ 11'這一行,但是確實如此。我不得不評論最後一個'.moc'行,'沒有這樣的文件或目錄'。這是原因嗎?另外,設想一個繪圖窗口,它具有XY軸,可配置的網格線數量,以及一個框,一個矩形,以適應所有的情況。這些我想添加/刪除而不觸及已經繪製的線條,因此它們的數量是固定的。也許這有幫助? –

+0

@aconcernedcitizen先運行qmake,然後嘗試構建。 – thuga

+0

然後,您可以將它們中的大部分存儲爲成員變量,並將信號連接到插槽並隱藏/顯示該插槽中的信號。所以你不必像我在例子中那樣使用'QVector'。您也可以使用插槽而不是lambda表達式。只需爲每個顯示/隱藏內容的複選框創建一個插槽即可。 – thuga