2010-02-05 5 views
0

J'ai essayé de dessiner un rectangle avec du texte à l'intérieur dans un QGraphicsView. Je reçois le texte de l'élément actuellement sélectionné dans un QTreeWidget. La scène semble sporadiquement montrer le texte, parfois ça va, parfois non.QGraphicsView texte manquant sur certains tirages

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

Répondre

0

Hmm, on dirait que vous créez une nouvelle scène sur chaque sélection d'article?

Ce n'est pas une façon très agréable d'aller

:)

Mieux procédez comme suit:

  1. Créer un '* QGraphicsScene m_scene;' et les membres de données 'QGraphicsSimpleTextItem * m_textItem' dans votre section privée de classe MainWindow.
  2. Dans MainWindow :: drawSectionFromProperties() font quelque chose comme:

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

De cette façon, vous ne créerons pas nouvelle scène à chaque sélection d'un élément. En fait, vous avez besoin d'une scène et d'un élément, pas besoin de les créer encore et encore et encore et de les empiler les uns sur les autres comme vous le faites actuellement.

cheers :)

+0

Votre suggestion vraiment aidé à organiser mon code mieux, mais il semble que ce fut le problème réel: m_textItem-> setZValue (10); – eyecreate

+0

oh, ça pourrait être. bien que je pensais que vous n'observiez aucun changement de texte en raison de nouvelles scènes créées de façon répétée - l'une sur l'autre - alors il cligna des yeux. Peut-être que je n'ai pas vu quelque chose quelque part :) En tout cas, heureux que vous ayez trouvé la solution de travail :) – dimsuz

Questions connexes