crossplatform.ru

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


  Ответ в Создание собственной палитры цветов
Введите ваше имя
Подтвердите код

Введите в поле код из 6 символов, отображенных в виде изображения. Если вы не можете прочитать код с изображения, нажмите на изображение для генерации нового кода.
Теги
Выровнять по центру
Ссылка на тему
Ссылка на сообщение
Скрытый текст
Сокращение
Код с подсветкой
Offtopic
 
Удалить форматирование
Спец. элементы
Шрифт
Размер
 
Цвет шрифта
 
Отменить ввод
Вернуть ввод
Полужирный
Курсив
Подчеркнутый
 
 
Смайлики
Вставить изображение
Вставить адрес электронной почты
Цитата
Код
Раскрывающийся текст
 
Увеличить отступ
По левому краю
По центру
По правому краю
Вставить список
Вставить список

Опции сообщения
 Включить смайлы?
Иконки сообщения
(Опционально)
                                
                                
  [ Без иконки ]
 


Последние 10 сообщений [ в обратном порядке ]
Алексей1153 Дата 16.1.2011, 13:14
  ассоциировать пару x,y с данными (цветом). Оттуда и отрисовывать, там и хранить и доставать оттуда же

struct s_x_y_key
{
   int x,y;

   s_x_y_key(int x=0, int y=0):x(x),y(y)
   {
   }

   bool operator < (const s_x_y_key& k2) const
   {
       if(x<k2.x)return true;
       if(x>k2.x)return false;
       return y<k2.y;
   }
};

struct s_x_y_val
{
   QColor c;
   s_x_y_val(QColor c=QColor(qrgb(0,0,0))):c(c)
  {
  }
}

typedef std::map<s_x_y_key,s_x_y_val> td_colormap;

td_colormap m_colormap;


(не компилировал, тут прямо писал)
AD Дата 16.1.2011, 0:04
 
Цитата(Алексей1153 @ 14.1.2011, 21:17) *

Ага. Еще раз спасибо.

Вопрос. А вот как определить у выделенного прямоугольника цвет? Что-то недокумекать эту функцию. Ну то есть функция возвращает выделенный прямоугольник. Как еще ей передать и цвет внутри прямоугольника.
QRect& PalletteWidget::getCoordRect(uint x, uint y, QRect& r, const QRect& winR)
{
    if(x >= ROWNUM || y >= COLNUM)
        r.setRect(0, 0, 0, 0);
    else
    {
        const uint W = getW(winR), H = getH(winR);
        r.setRect(x * W, y * H, W, H);
    }
    return r;
}

Заранее спасибо за помощь.
Алексей1153 Дата 14.1.2011, 21:17
 
Цитата(AD @ 14.1.2011, 13:40) *
if(x >= ROWNUM || y >= COLNUM)

опять перепутано, кстати. Ведь x - это колонка, y - это строка. Вообщем-то, всё это условно, но помогает не запутаться

if(col >= COLNUM || row >= ROWNUM)


if(x >= XNUM || y >= YNUM)
Алексей1153 Дата 14.1.2011, 17:48
  AD, насколько я понимаю, у тебя передаётся winR с началом в точке 0,0. Координаты в 'p' тоже должны быть относительно этого начала координат выставлены. В общем, общая беда подобных функций - что приходится об этом гадать (и у меня в коде та же фигня, кстати. вышла) - нужно комментарий перед функцией написать, что относительно чего должно быть в параметрах. Через неделю уже забудешь ))
AD Дата 14.1.2011, 11:40
  Самое смешное, что эту ошибку с ROWNUM и COLNUM допустил при переносе кода сюда! :) А вообще, проблему давно уже решил, спасибо, дело было в функции isXYFromPoint. Сделал вот так и все заработало:
/// Пpoвepka координат на соответствие точке
bool PalletteWidget::isXYFromPoint(QPoint p, const QRect& winR, uint& x, uint& y)
{
    x = p.x() / getW(winR), y = p.y() / getH(winR);
    if(x >= ROWNUM || y >= COLNUM)
        return false;

    return true;
}
Алексей1153 Дата 13.1.2011, 19:42
  а у тебя вот тут точно правильно COLNUM и ROWNUM расставлены ?

 for(uint i=0; i<COLNUM; ++i)
        for(uint j=0; j<ROWNUM; ++j)


Если по аналогии с моим кодом, то i~y - это строки, а j~x - это колонки

раз тут перепутано, то и в остальных местах тоже может быть перепутано. Зря так обозвал переменные - не мнемонично, то ли дело x и y ))

хотя, у тебя размеры оба по 14, разницу сейчас не видно. Можешь код класса прицепить ? Посмотреть проще, чем догадываться
AD Дата 13.1.2011, 10:56
  Что-то у меня с курсором не получается. Там где указана стрелка, находится курсор. А прямоугольник обведен в другом месте. Вот картинка:
 РЈРјРµРЅСЊС€РµРЅРѕ РґРѕ 52%
Прикрепленное изображение
549 x 548 (38.32 килобайт)



Вот код, собственно, совсем приведенный Алексеем1153 и слегка измененный:

/// Ompucoвkа содержимого виджета
void PalletteWidget::paintEvent(QPaintEvent* events)
{
    QPainter painter(this);
    const QRect winR(geometry());
    QRect r;

    for(uint i=0; i<COLNUM; ++i)
        for(uint j=0; j<ROWNUM; ++j)
            painter.fillRect(getCoordRect(j, i, r, winR), QBrush(QColor(_colors[i][j])));

    QPoint m_pos(mapFromGlobal(QCursor::pos()));
    const uint W = getW(winR), H = getH(winR);
    uint x = 0, y = 0;

    if(isXYFromPoint(m_pos, winR, x, y))
    {
        painter.setPen(qRgb(195, 195, 195));
        painter.drawRect(getCoordRect(x, y, r, winR));
        painter.drawRect(getCoordRect(x, y, r, winR).adjusted(1, 1, -1, -1));
    }
}


Если не делать mapFromGlobal, то курсор еще дальше от прямоугольника.
Алексей1153 Дата 23.12.2010, 8:11
  я вчера, похоже, перепутал педали, когда менял файлы. Вот с мышью который должен был быть )))
Алексей1153 Дата 22.12.2010, 22:16
  вот с мышью
Алексей1153 Дата 22.12.2010, 20:56
  вот основу накидал, осталось только мышь приделать. Координаты прямоугольничков получаются из соответствующих функций
Просмотр темы полностью (откроется в новом окне)
RSS Рейтинг@Mail.ru Текстовая версия Сейчас: 28.7.2025, 20:17