crossplatform.ru

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

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


Активный участник
***

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

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




Репутация:   1  


Есть paintEvent :
void Test1Widget::paintEvent(QPaintEvent * event)
{
    PaintForTest1 = new QPainter(this);
    PaintForTest1->setRenderHint(QPainter::Antialiasing, true);
    QRgb rgb;
    rgb = (this->RedSlider->value(), this->GreenSlider->value(), this->BlueSlider->value());
    QColor mycolor(rgb);
    PaintForTest1->setBrush(QBrush(mycolor, Qt::SolidPattern));
    PaintForTest1->drawRect(1, 1, 100, 100);
}


3 слайдера(их значения от 0 до 255) соединены с виджетом вот так :
void Test1Widget::SetConnections()
{
connect(RedSlider,SIGNAL(valueChanged(int)),this,SLOT(update()));
connect(GreenSlider,SIGNAL(valueChanged(int)),this,SLOT(update()));
connect(BlueSlider,SIGNAL(valueChanged(int)),this,SLOT(update()));
}


Проблема : QBrush реагирует только на синюю компоненту цвета. остальные игнорирует.почему?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
SABROG
  опции профиля:
сообщение 1.3.2009, 15:57
Сообщение #2


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

Группа: Участник
Сообщений: 1207
Регистрация: 8.12.2008
Из: Russia, Moscow
Пользователь №: 446

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




Репутация:   34  


Цитата(Andrewshkovskii @ 1.3.2009, 15:25) *
rgb = (this->RedSlider->value(), this->GreenSlider->value(), this->BlueSlider->value());

Похоже у меня брешь в знаниях C++. Что сия запись означает? Есть догадка, что это что-то типа объявления 3х безымянных переменных, а скобки играют ту же роль что и в математических операциях, может быть компилер и берет только последнюю. Особенно странно становится, когда я узнаю, что QRgb не класс и не структура, а алиас типа для unsigned int, в котором кстати 4 байта. Альфаканал еще.

На warning'и компилятора вообще внимания не обращаешь?

warning: left-hand operand of comma has no effect
warning: right-hand operand of comma has no effect


Сообщение отредактировал SABROG - 1.3.2009, 16:19
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
kwisp
  опции профиля:
сообщение 1.3.2009, 16:02
Сообщение #3


астарожна ынтжинэр
*****

Группа: Участник
Сообщений: 1404
Регистрация: 26.11.2008
Из: ТаганрогРодинаЧехова
Пользователь №: 435

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




Репутация:   23  


Andrewshkovskii,
PaintForTest1 = new QPainter(this);

подозреваю что PaintForTest1 член класса.
если так то под него каджый раз память выделяться будет при каждом новом вызове paintEvent.
а где память освобождается?

Цитата(Andrewshkovskii @ 1.3.2009, 15:25) *
QRgb rgb;
rgb = (this->RedSlider->value(), this->GreenSlider->value(), this->BlueSlider->value());
QColor mycolor(rgb);
PaintForTest1->setBrush(QBrush(mycolor, Qt::SolidPattern));


может легче написать
 PaintForTest1->setBrush(QBrush(QColor(this->RedSlider->value(), this->GreenSlider->value(), this->BlueSlider->value()));
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 1.3.2009, 16:54
Сообщение #4


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

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

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




Репутация:   94  


Цитата(Andrewshkovskii @ 1.3.2009, 18:25) *
rgb = (this->RedSlider->value(), this->GreenSlider->value(), this->BlueSlider->value());

надо заменить на:
Цитата
rgb = qRgb(this->RedSlider->value(), this->GreenSlider->value(), this->BlueSlider->value());
и вроде всё

Цитата(kwisp @ 1.3.2009, 19:02) *
подозреваю что PaintForTest1 член класса.
если так то под него каджый раз память выделяться будет при каждом новом вызове paintEvent.
а где память освобождается?
хорошее замечание.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
kwisp
  опции профиля:
сообщение 1.3.2009, 17:09
Сообщение #5


астарожна ынтжинэр
*****

Группа: Участник
Сообщений: 1404
Регистрация: 26.11.2008
Из: ТаганрогРодинаЧехова
Пользователь №: 435

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




Репутация:   23  


извините великодушно.
зачем вообще этот rgb в данном случае????
нужен цвет отрисовки.
это не суть важно конечно...
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
SABROG
  опции профиля:
сообщение 1.3.2009, 17:24
Сообщение #6


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

Группа: Участник
Сообщений: 1207
Регистрация: 8.12.2008
Из: Russia, Moscow
Пользователь №: 446

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




Репутация:   34  


Цитата(kwisp @ 1.3.2009, 17:09) *
извините великодушно.
зачем вообще этот rgb в данном случае????
нужен цвет отрисовки.
это не суть важно конечно...

Не нужен конечно, т.к. конструктор QBrush принимает QColor, а тот в свою очередь умеет r,g,b параметры брать. К тому Qt::SolidPattern стоит по-умолчанию, его не обязательно прописывать.

Сообщение отредактировал SABROG - 1.3.2009, 17:25
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
kwisp
  опции профиля:
сообщение 1.3.2009, 17:38
Сообщение #7


астарожна ынтжинэр
*****

Группа: Участник
Сообщений: 1404
Регистрация: 26.11.2008
Из: ТаганрогРодинаЧехова
Пользователь №: 435

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




Репутация:   23  


Цитата(SABROG @ 1.3.2009, 17:24) *
Не нужен конечно

+1
на что я и намекаю.
ведь это обработчик события отрисовки тут необходимо минимум лишней нагрузки дать. зачем вызывать лишние конструкторы.
вот если PaintForTest1 член класса .
зачем при каждой отрисовке делать ему PaintForTest1->setRenderHint(QPainter::Antialiasing, true);
можно в конструкторе класса задать это свойство и все эффект тот же или я ошибаюсь в чем то?

потом стрнно как вообще рисует что то.... если PaintForTest1 не разрушается по выходу из функции и ему не делают end()
.....

Цитата
A painter is activated by the begin() function and the constructor that takes a QPaintDevice argument. The end() function, and the destructor, deactivates it.


Сообщение отредактировал kwisp - 1.3.2009, 17:41
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Andrewshkovskii
  опции профиля:
сообщение 2.3.2009, 1:58
Сообщение #8


Активный участник
***

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

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




Репутация:   1  


Ох, раскритиковали:))
Насчет создания/уничтожения - это же локальные переменные метода, они создаются при вызове и уничтожаются после выполнения метода, насколько мне известно.
Цитата
ЛОКАЛЬНЫЕ переменные подразделяются на АВТОМАТИЧЕСКИЕ и СТАТИСТИЧЕСКИЕ.

Автоматические переменные уничтожаются сразу после завершения того блока, в котором они описаны.

Автоматические переменные описываются со словом auto.

auto float с;

По умолчанию все переменные являются автоматическими, поэтому префикс auto можно не указывать.


Потом,если не создавать каждый раз в методое QPainter, то никакой отрисовки вообще не происходит(по крайней мере у меня, только что проверял, может я и вправду такой криворукий)
Насчет выставления цветов в одном выражении спасибо!:)
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Константин
  опции профиля:
сообщение 2.3.2009, 2:17
Сообщение #9


Студент
*

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

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




Репутация:   1  


void Test1Widget::paintEvent(QPaintEvent * event)
{
    QPainter p(this);
    p.setRenderHint(QPainter::Antialiasing, true);
/* весь этот блок в контексте paintEvent - моразм!
    QRgb rgb;
    rgb = (this->RedSlider->value(), this->GreenSlider->value(), this->BlueSlider->value());
    QColor mycolor(rgb);
*/
    p.setBrush(QBrush(mycolor, Qt::SolidPattern));
    p.drawRect(1, 1, 100, 100);
}

вынеси mycolor в члены класса и разгранич доступ к нему. для удобства можно добавить слоты ака setRed/setGreen/setBlue, в которых будет предварительно высчитываться нужный цвет, - их и связывать уже с соответствующими сигналами.
а так ты не виджет лепишь, а какое-то монструзное незнамо-что...
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 2.3.2009, 7:56
Сообщение #10


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

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

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




Репутация:   94  


Цитата(Andrewshkovskii @ 2.3.2009, 4:58) *
Насчет создания/уничтожения - это же локальные переменные метода,
в том-то и дело, что у тебя это не локальная переменная метода, твой код:
Цитата(Andrewshkovskii @ 1.3.2009, 18:25) *
PaintForTest1 = new QPainter(this);
т.е. она объявлена где-то раньше.
А вот у Константина да.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

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


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


RSS Рейтинг@Mail.ru Текстовая версия Сейчас: 7.6.2025, 16:01