crossplatform.ru

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

 
Ответить в данную темуНачать новую тему
> Не удаются активировать Painter
QMainWindow
  опции профиля:
сообщение 2.3.2011, 17:14
Сообщение #1


Участник
**

Группа: Участник
Сообщений: 198
Регистрация: 1.8.2010
Пользователь №: 1922

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




Репутация:   0  


Привет всем!
Недавно сделал простенький класс для рисования графиков, используя функционал QPainter. Класс общий, хочу использовать его в разных приложениях через #include. Дело обстоит так: не хочет мой класс рисовать. Проблему понял как решать, но как сделать это руками не ясно. Итак, в классе есть такой команда PlotAxisXRight() - нарисовать правую часть оси Х(откуда до куда рисовать считается автоматически). Выглядит так:
void Plot2D::PlotAxisXRight()
{
p->drawLine(QPointF(0,0), QPointF(KX*tempMaxX, 0));
}

p - это QPainter, который я использую в данном классе. Теперь хочу нарисовать ее на каком-нибудь виджете. Создал этот виджет, в нем объект моего класса(Plot2D), в его конструкторе передал все необходимое. В paintEvent виджета пишу:
void MainWidget::paintEvent(QPaintEvent *event)
{
    painter.begin(this);
    painter.setPen(QPen(QColor(0,0,0), 10, Qt::SolidLine, Qt::RoundCap));
    plotter->PlotAxisXRight(); // plotter - это объект моего класса.
    p.end();
}
Вот здесь проблема: не знаю как связать painter и p. Думал, сделать как-то так:
void Plot2D::setPainter(QPainter *painter)
{
    p=painter;
}
а затем написать plotter->setPainter(&painter); и вставить эту команду в предыдущий код, но он ругается, мол вновь не активен. Помогите плиз!)
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Rocky
  опции профиля:
сообщение 2.3.2011, 18:17
Сообщение #2


Старейший участник
****

Группа: Участник
Сообщений: 530
Регистрация: 22.12.2008
Из: Санкт-Петербург
Пользователь №: 463

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




Репутация:   7  


Цитата(QMainWindow @ 2.3.2011, 18:14) *
Недавно сделал простенький класс для рисования графиков, используя функционал QPainter........... Дело обстоит так: не хочет мой класс рисовать.

=)))))))))))

Как минимум надо делать так:
void Plot2D::PlotAxisXRight(QPainter *p)
{
p->drawLine(QPointF(0,0), QPointF(KX*tempMaxX, 0));
}
...........
void MainWidget::paintEvent(QPaintEvent *event)
{
    QPainter painter(...);
    painter.eraseRect(...);
    painter.setPen(QPen(QColor(0,0,0), 10, Qt::SolidLine, Qt::RoundCap));
    plotter->PlotAxisXRight(&painter); // plotter - это объект моего класса.
...........
}


Только вот вопрос, а как и где определяются KX и tempMaxX? Их нельзя делать жестко забитыми. Они должны вычисляться на основании viewport-а painter-а.


А лучше всего не изобретать ничего и использовать qwt.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 2.3.2011, 18:27
Сообщение #3


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

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

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




Репутация:   94  


Цитата(Rocky @ 2.3.2011, 20:17) *
Они должны вычисляться на основании viewport-а painter-а.
в примерах тролей часто используют прямоугольник виджета. Я тоже так делал.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
QMainWindow
  опции профиля:
сообщение 2.3.2011, 18:39
Сообщение #4


Участник
**

Группа: Участник
Сообщений: 198
Регистрация: 1.8.2010
Пользователь №: 1922

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




Репутация:   0  


Свой велосипед лучше двух чужих! :) Смотрел qwt - не понравился. KX и tempMaxX определяются в конструкторе, туда все необходимое передаётся. Вот я думал так сделать:
void Plot2D::PlotAxisXRight(QPainter *p)
{
p->drawLine(QPointF(0,0), QPointF(KX*tempMaxX, 0));
}
но передавать QPainter *p в каждую подобную функцию глупо. Я изначально хотел сделать мастер-функцию, в которой обозначить передаваемый painter. Присвоение не помогает...
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
QMainWindow
  опции профиля:
сообщение 17.3.2011, 14:17
Сообщение #5


Участник
**

Группа: Участник
Сообщений: 198
Регистрация: 1.8.2010
Пользователь №: 1922

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




Репутация:   0  


Ну что, никто не знает, как клонировать пейнтер в другом классе. Ну не хочу в качестве аргумента передавать в каждой функции &painter.

Может как-нибудь с помощью функции setRedirected?..
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
wiz29
  опции профиля:
сообщение 18.3.2011, 10:12
Сообщение #6


Старейший участник
****

Группа: Участник
Сообщений: 600
Регистрация: 7.7.2010
Из: Санкт-Петербург
Пользователь №: 1866

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




Репутация:   12  


Цитата(QMainWindow @ 17.3.2011, 14:17) *
Ну что, никто не знает, как клонировать пейнтер в другом классе. Ну не хочу в качестве аргумента передавать в каждой функции &painter.

Может как-нибудь с помощью функции setRedirected?..


Добрый день, попробуй передавать в свой класс указтель QPaintDevice (это QWidget, QImage и др...) думаю так будет гораздо прозрачней....
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
QMainWindow
  опции профиля:
сообщение 25.3.2011, 20:32
Сообщение #7


Участник
**

Группа: Участник
Сообщений: 198
Регистрация: 1.8.2010
Пользователь №: 1922

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




Репутация:   0  


Передал, а затем в классе создал: p = new QPainter(*Transmited_PaintDevice); но все равно говорит, что пейнтер не активен...

Короч вот мой класс, может у вас получится))
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

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


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




RSS Текстовая версия Сейчас: 18.1.2025, 2:29