crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

2 страниц V   1 2 >  
Ответить в данную темуНачать новую тему
> проблема с рисованием
narik1985
  опции профиля:
сообщение 21.5.2009, 2:17
Сообщение #1


Новичок


Группа: Новичок
Сообщений: 9
Регистрация: 14.4.2009
Пользователь №: 681

Спасибо сказали: 0 раз(а)




Репутация:   0  


доброй ночи всем.
//sk.h

#ifdef SK
#define SK

#include <QtGui>
class QWidget;
class CodeEdit : public QWidget
{
Q_OBJECT
public:
CodeEdit(QWidget *parent = 0);
protected:
void paintEvent(QPaintEvent *);
}

#endif


//sk.cpp

CodeEdit::CodeEdit(QWidget *parent):QWidget(parent)
          {};
void CodeEdit::paintEvent(QPaintEvent *)
          {
           QPainter paint(this);
           paint.drawText(50,50,"hello world!!!");
          };


//main.cpp
#include <QtGui>

int main(int argc,char *argv[])
         {
          QApplication app(argc,argv);
          CodeEdit *codeEdit = new CodeEdit;
          codeEdit->show();
          QEvent event(QEvent::Paint);
          QApplication::sendEvent(codeEdit,&event);
          return app.exec();

          }


При запуске выдает:
QPainter::begin: Widget painting can only begin as a result of a paintEvent

вопросы: почему если я вызываю в программе событие Paint он не рисует? а если программа сама генерирует событие то выводится все нормально?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 21.5.2009, 3:19
Сообщение #2


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9669
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 807 раз(а)




Репутация:   94  


возможно это из-за того, что ты пытешся послать событие до запуска цикла обработки события (т.е. до app.exec())
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
narik1985
  опции профиля:
сообщение 21.5.2009, 20:43
Сообщение #3


Новичок


Группа: Новичок
Сообщений: 9
Регистрация: 14.4.2009
Пользователь №: 681

Спасибо сказали: 0 раз(а)




Репутация:   0  


Цитата(Litkevich Yuriy @ 21.5.2009, 4:19) *
возможно это из-за того, что ты пытешся послать событие до запуска цикла обработки события (т.е. до app.exec())


пробывал поднимать app.exec() на не сколько строчек вверх, код создания события выполняется только после закрытия окна, я что-то не так делаю?
и еще вопрос, в класс CodeEdit добавил функию keyPressEvent(QKeyEvent)
void CodeEdit::KeyPressEvent(QKeyEvent *key)
        {
         QEvent event(QEvent::Paint);
         QApplication::sendEvent(this,&event);
        }

Как я понимаю при нажатии кнопки клавиатуры, должно вызываться событие Paint и выполнятся вызов функции paintEvent, но прорисовки не выполняется, выводит все то же самое сообщение
QPainter::begin: Widget painting can only begin as a result of a paintEvent
Причина редактирования: используй тэг code
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 21.5.2009, 20:49
Сообщение #4


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9669
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 807 раз(а)




Репутация:   94  


Цитата(narik1985 @ 22.5.2009, 0:43) *
пробывал поднимать app.exec() на не сколько строчек вверх,
это без смысленно.
т.к. приложение в принципе будет выполнятся в это функции, т.е. то что после нёё будет выполнено, когда будет завершаться приложение.
Лучше из main'а вообще убери посылку сообщений.

Цитата(narik1985 @ 22.5.2009, 0:43) *
Как я понимаю при нажатии кнопки клавиатуры, должно вызываться событие Paint и выполнятся вызов функции paintEvent, но прорисовки не выполняется, выводит все то же самое сообщение
а при изменении размера виджета, рисование происходит?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
narik1985
  опции профиля:
сообщение 21.5.2009, 20:51
Сообщение #5


Новичок


Группа: Новичок
Сообщений: 9
Регистрация: 14.4.2009
Пользователь №: 681

Спасибо сказали: 0 раз(а)




Репутация:   0  


при изменении размера происходит, при перетаскивании нет
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 21.5.2009, 20:54
Сообщение #6


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9669
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 807 раз(а)




Репутация:   94  


события посылать я не пробовал, незнаю точно как это делается.
Но для проверки события кнопок (KeyPressEvent), можно вместо посылки сообщения (sendEvent) вызвать метод paint()
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
igor_bogomolov
  опции профиля:
сообщение 21.5.2009, 20:59
Сообщение #7


Профессионал
*****

Группа: Сомодератор
Сообщений: 1215
Регистрация: 22.3.2009
Из: Саратов
Пользователь №: 630

Спасибо сказали: 235 раз(а)




Репутация:   29  


Цитата(Litkevich Yuriy @ 21.5.2009, 21:54) *
можно вместо посылки сообщения (sendEvent) вызвать метод paint()
Только не paint, a update

Цитата
void QWidget::update () [slot]


void CodeEdit::KeyPressEvent(QKeyEvent *key)
{
    update();
}


Сообщение отредактировал igor_bogomolov - 21.5.2009, 21:02
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
narik1985
  опции профиля:
сообщение 21.5.2009, 21:05
Сообщение #8


Новичок


Группа: Новичок
Сообщений: 9
Регистрация: 14.4.2009
Пользователь №: 681

Спасибо сказали: 0 раз(а)




Репутация:   0  


Цитата(Litkevich Yuriy @ 21.5.2009, 21:54) *
события посылать я не пробовал, незнаю точно как это делается.
Но для проверки события кнопок (KeyPressEvent), можно вместо посылки сообщения (sendEvent) вызвать метод paint()

Я использую qDebug() с выводом сообщения для каждого события, они на экран выводятся(то есть при нажатии кнопки выводит сообщение о нажатой кнопке, а потом сообщение о прорисовке)
Как использовать метод paint() не подскажешь?

С Update() все получается, но в чем именно я не прав?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
igor_bogomolov
  опции профиля:
сообщение 21.5.2009, 21:46
Сообщение #9


Профессионал
*****

Группа: Сомодератор
Сообщений: 1215
Регистрация: 22.3.2009
Из: Саратов
Пользователь №: 630

Спасибо сказали: 235 раз(а)




Репутация:   29  


Цитата(narik1985 @ 21.5.2009, 22:05) *
С Update() все получается, но в чем именно я не прав?
Про что вопрос? Как сэмулировать событие рисования?
void CodeEdit::KeyPressEvent(QKeyEvent *key)
{
         QPaintEvent *event = new QPaintEvent(rect());
         QCoreApplication::postEvent(this, event);
}
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
narik1985
  опции профиля:
сообщение 21.5.2009, 22:00
Сообщение #10


Новичок


Группа: Новичок
Сообщений: 9
Регистрация: 14.4.2009
Пользователь №: 681

Спасибо сказали: 0 раз(а)




Репутация:   0  


Цитата(igor_bogomolov @ 21.5.2009, 22:46) *
Цитата(narik1985 @ 21.5.2009, 22:05) *
С Update() все получается, но в чем именно я не прав?
Про что вопрос? Как сэмулировать событие рисования?
void CodeEdit::KeyPressEvent(QKeyEvent *key)
{[codebox]sk.cpp In member function 'virtual void CodeEdit::keyPressEvent(QKeyEvent*)':
sk.cpp:25: error: '((CodeEdit*)this)->CodeEdit::rect' cannot be used as a function[/codebox]
         QPaintEvent *event = new QPaintEvent(rect());
         QCoreApplication::postEvent(this, event);
}


Не вопрос в другом, почем когда я событие из события вызываю, то он не отрисовывает, в то время когда приложение само вызывает, то отрисовка проходит, что я конкретно не правильно делаю... (как мне кажется работать же должно)
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

2 страниц V   1 2 >
Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


3 чел. читают эту тему (гостей: 3, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 29.11.2024, 1:51