crossplatform.ru

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


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

Введите в поле код из 6 символов, отображенных в виде изображения. Если вы не можете прочитать код с изображения, нажмите на изображение для генерации нового кода.
 

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


Последние 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
  Что-то у меня с курсором не получается. Там где указана стрелка, находится курсор. А прямоугольник обведен в другом месте. Вот картинка:
Прикрепленное изображение



Вот код, собственно, совсем приведенный Алексеем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 Текстовая версия Сейчас: 28.3.2024, 13:05