2010-02-05 24 views
0

我試圖在QGraphicsView中繪製一個帶有文本的矩形。我從QTreeWidget中獲取當前選定項目的文本。現場似乎零星地顯示文字,有時會出現,有時候不會。QGraphicsView在一些繪圖上缺少文本

void MainWindow::on_treewidget_itemSelectionChanged() 
{ 
drawSectionFromProperties(ui->treewidget->currentItem()); 
} 

void MainWindow::drawSectionFromProperties(QTreeWidgetItem *section) 
{ 
     ui->graphicsview->setScene(new QGraphicsScene()); 
     ui->graphicsview->scene()->addRect(0,0,200,300,QPen(QColor(0,0,0)),QBrush(QColor(255,250,129))); 
     QFont objectTitle; 
     ui->graphicsview->scene()->addSimpleText(section->text(0),objectTitle); 
} 

回答

0

嗯,看起來像你正在每個項目選擇上創建一個新的場景?

這不是一個很好的路要走:)

更好地做好以下幾點:

  1. 創建 'QGraphicsScene * m_scene;'和'QGraphicsSimpleTextItem * m_textItem'數據成員在您的MainWindow類私人部分。
  2. 在主窗口:: drawSectionFromProperties()做這樣的事情:

MainWindow::MainWindow(QWidget* parent, ...) 
    : m_scene(0), m_textItem(0) 
{ 
... 
} 

// leave your on_treewidget_itemSelectionChanged as is 

void MainWindow::drawSectionFromProperties(QTreeWidgetItem *section) 
{ 
    // setup things only ONE time on the first call 
    if(!m_scene) 
    { 
     m_scene = new QGraphicsScene(); 
     ui->graphicsview->setScene(m_scene); 
     m_textItem = ui->graphicsview->scene()->addSimpleText(QString()); 
    } 

    // here only change text of existing item 
    m_textItem->setText(section->text(0)); 
} 

這樣你就不會在每一個項目選擇要創建新的場景。其實你需要一個場景和一個項目,不需要一遍又一遍地創建它們,並像現在一樣將其疊加到另一個上。

乾杯:)

+0

你的建議真的幫了我的組織更好的代碼,但似乎這是實際的問題: m_textItem-> setZValue(10); – eyecreate 2010-02-05 15:51:17

+0

哦,可能是。儘管我認爲你不會觀察到由於新的場景被反覆創建而造成的文本變化 - 一個在另一個之上 - 所以它眨了眨眼睛。也許我沒有看到某個地方:)無論如何,很高興你找到了工作解決方案:) – dimsuz 2010-02-08 10:51:42