2013-06-30 9 views
0

Я изучаю QT5 для удовольствия, и я узнаю о картине для виджетов для игры 2d. Я просматривал множество учебников и документации, и хочу получить информацию о том, где исследовать здесь.QT painting для виджета

Из того, что я узнал, кажется, что рисование может быть выполнено только в функции paintEvent. Я пытаюсь понять, как сделать так, чтобы я мог условно рисовать что-то на виджетах в зависимости от ввода с клавиатуры. Например, я хочу, чтобы он печатал «alpha», если я нажимаю a и «beta», если я нажму b.

Очевидно, я мог бы сделать это с помощью глобальной строковой переменной, но какими были бы другие способы? Я ищу правильный способ QT для этого, любые предложения? Как бы вы реализовали следующий psudocode?

void paintEvent(QPaintEvent*) 
{ 
    QPainter painter(this); 

    //painter.drawText(QPoint(100,100), "example"); 

} 


void keyPressEvent(QKeyEvent *k) 
{ 
    QString temp = k->text(); 

    if(temp == "a") 
     //paint "alpha" 
    if(temp == "b") 
     //paint "beta" 
} 

Заранее благодарен!

ответ

1

Вы должны использовать QGraphicsScene. Это более высокий уровень, чем paintEvent, он имеет много удобных возможностей и должен использоваться, если вы хотите нарисовать что-то, что не совсем тривиально.

Например, в вашем случае вам необходимо сохранить переменную QGraphicsTextItem* text_item в качестве члена класса. При инициализации вы выполните следующие действия:

text_item = scene->addText("initial text"); 

Когда вы решили изменить текст, просто использовать этот объект:

text_item->setPlainText("new_text"); 

каркас графического представление будет перекрашивать соответствующую область для вас.

Это не полный пример. Вам нужно добавить представление к вашему виджету и инициализировать сцену, чтобы получить эту работу. Более подробную информацию см. На странице Graphics View Framework.

0

Вы в значительной степени там. Вы должны использовать переменную-член, а не глобальную. Я бы написать свой метод, как это нажатие:

class MyWidget : public QWidget { 
    protected: 
     void paintEvent(QPaintEvent*); 
     void keyPressEvent(QKeyEvent*); 
    private: 
     QString mText; 
}; 

... 

void MyWidget::keyPressEvent(QKeyEvent *k) { 
    if(k->key() == Qt::Key_A) 
     mText = "alpha"; 
    else if(k->key() == Qt::Key_B) 
     mText = "beta"; 

    update(); 
} 

Использование key() будет намного безопаснее, чем магические сравнения строк.

+0

Действительно? Это имеет смысл, но кажется слишком обходным. Как насчет использования QPixmap? Должен ли я активно хранить в переменных все, что я хочу, чтобы рисовать в paintEvent? – Nathan

+0

Я не уверен, что QPixmap собирается сделать для вас в этом примере. И да, вам нужно поддерживать состояние отдельно от события рисования. Он будет вызван много раз автоматически системой окраски Qt, и вам нужно будет знать состояние вашего виджета в любой момент времени, а не только во время keyPress. – Chris

+0

Это кажется довольно неэффективным. Есть ли способ, чтобы область рисования оставалась статической между вызовами paintEvent? – Nathan

Смежные вопросы