Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум на CrossPlatform.RU _ Qt GUI _ Создание собственной палитры цветов

Автор: AD 22.12.2010, 16:11

Есть необходимость создать диалоговое окошко собственной палитры цветов. Собственно вопрос в том, что лучше использовать для цвета QTableView или же QTableWidget, или же еще что-то?
Выглядеть окошко будет так:


Рад буду и благодарен оперативным сообщениям.

Автор: BRE 22.12.2010, 16:47

Как мне кажется таблицы я бы использовать не стал.
Либо наследовался бы от QFrame (или QWidget) и рисовал все сам + обработка кликов мышки.
Или посмотрел бы на QGraphicsView+QGraphicsScene.
Наверное так. :rolleyes:

Автор: AD 22.12.2010, 16:53

Цитата(BRE @ 22.12.2010, 16:47) *
Как мне кажется таблицы я бы использовать не стал.
Либо наследовался бы от QFrame (или QWidget) и рисовал все сам + обработка кликов мышки.
Или посмотрел бы на QGraphicsView+QGraphicsScene.
Наверное так. :rolleyes:

QWidget для каждой ячейки цвета? :) Или же QWidget в котором делается какое-то деление? С помощью чего?

Автор: BRE 22.12.2010, 17:06

QWidget на все.
А что там рисовать... прямоугольники нужного цвета + писать текст.

Автор: AD 22.12.2010, 17:34

Цитата(BRE @ 22.12.2010, 17:06) *
QWidget на все.
А что там рисовать... прямоугольники нужного цвета + писать текст.

А потом вылавливать точку экрана в которую тыкнули? :blink: А есть способ менее извращенческий? Серьезно, это ведь не самый лучший метод. Заранее спасибо, если подскажете поудобнее метод.

Автор: BRE 22.12.2010, 18:47

А что там вылавливать? :)
Ты получаешь координаты мыши относительно виджета.
cell.x = mousePos.x / blockSize.width;
cell.y = mousePos.y / blockSize.height;

cell - порядковый номер цветового блока по горизонтали/вертикали.
blockSize - размеры цветового прямоугольника

Автор: Алексей1153 22.12.2010, 20:17

BRE, ага, я бы тоже одним голимым окошком обошёлся ) Задача - фигня

Автор: Алексей1153 22.12.2010, 20:56

вот основу накидал, осталось только мышь приделать. Координаты прямоугольничков получаются из соответствующих функций

Автор: Алексей1153 22.12.2010, 22:16

вот с мышью

Автор: Алексей1153 23.12.2010, 8:11

я вчера, похоже, перепутал педали, когда менял файлы. Вот с мышью который должен был быть )))

 CMyColorPalette_mouse.zip ( 1.38 килобайт ) : 113
 

Автор: 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 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 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 14.1.2011, 17:48

AD, насколько я понимаю, у тебя передаётся winR с началом в точке 0,0. Координаты в 'p' тоже должны быть относительно этого начала координат выставлены. В общем, общая беда подобных функций - что приходится об этом гадать (и у меня в коде та же фигня, кстати. вышла) - нужно комментарий перед функцией написать, что относительно чего должно быть в параметрах. Через неделю уже забудешь ))

Автор: Алексей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)

Автор: 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 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;


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

Форум Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)