crossplatform.ru

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

2 страниц V  < 1 2  
Ответить в данную темуНачать новую тему
> Создание собственной палитры цветов, Что лучше использовать?
AD
  опции профиля:
сообщение 13.1.2011, 10:56
Сообщение #11


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

Группа: Участник
Сообщений: 2003
Регистрация: 4.2.2008
Из: S-Petersburg
Пользователь №: 84

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




Репутация:   17  


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



Вот код, собственно, совсем приведенный Алексеем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
  опции профиля:
сообщение 13.1.2011, 19:42
Сообщение #12


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

Группа: Участник
Сообщений: 2939
Регистрация: 19.6.2010
Из: Обливион
Пользователь №: 1822

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




Репутация:   34  


а у тебя вот тут точно правильно COLNUM и ROWNUM расставлены ?

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


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

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

хотя, у тебя размеры оба по 14, разницу сейчас не видно. Можешь код класса прицепить ? Посмотреть проще, чем догадываться

Сообщение отредактировал Алексей1153 - 13.1.2011, 19:45
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
AD
  опции профиля:
сообщение 14.1.2011, 11:40
Сообщение #13


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

Группа: Участник
Сообщений: 2003
Регистрация: 4.2.2008
Из: S-Petersburg
Пользователь №: 84

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




Репутация:   17  


Самое смешное, что эту ошибку с 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
  опции профиля:
сообщение 14.1.2011, 17:48
Сообщение #14


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

Группа: Участник
Сообщений: 2939
Регистрация: 19.6.2010
Из: Обливион
Пользователь №: 1822

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




Репутация:   34  


AD, насколько я понимаю, у тебя передаётся winR с началом в точке 0,0. Координаты в 'p' тоже должны быть относительно этого начала координат выставлены. В общем, общая беда подобных функций - что приходится об этом гадать (и у меня в коде та же фигня, кстати. вышла) - нужно комментарий перед функцией написать, что относительно чего должно быть в параметрах. Через неделю уже забудешь ))
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Алексей1153
  опции профиля:
сообщение 14.1.2011, 21:17
Сообщение #15


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

Группа: Участник
Сообщений: 2939
Регистрация: 19.6.2010
Из: Обливион
Пользователь №: 1822

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




Репутация:   34  


Цитата(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, 21:18
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
AD
  опции профиля:
сообщение 16.1.2011, 0:04
Сообщение #16


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

Группа: Участник
Сообщений: 2003
Регистрация: 4.2.2008
Из: S-Petersburg
Пользователь №: 84

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




Репутация:   17  


Цитата(Алексей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
  опции профиля:
сообщение 16.1.2011, 13:14
Сообщение #17


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

Группа: Участник
Сообщений: 2939
Регистрация: 19.6.2010
Из: Обливион
Пользователь №: 1822

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




Репутация:   34  


ассоциировать пару 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;


(не компилировал, тут прямо писал)

Сообщение отредактировал Алексей1153 - 16.1.2011, 13:16
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

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


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




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