Есть необходимость создать диалоговое окошко собственной палитры цветов. Собственно вопрос в том, что лучше использовать для цвета QTableView или же QTableWidget, или же еще что-то?
Выглядеть окошко будет так:
Как мне кажется таблицы я бы использовать не стал.
Либо наследовался бы от QFrame (или QWidget) и рисовал все сам + обработка кликов мышки.
Или посмотрел бы на QGraphicsView+QGraphicsScene.
Наверное так.
QWidget на все.
А что там рисовать... прямоугольники нужного цвета + писать текст.
А что там вылавливать?
Ты получаешь координаты мыши относительно виджета.
cell.x = mousePos.x / blockSize.width;
cell.y = mousePos.y / blockSize.height;
cell - порядковый номер цветового блока по горизонтали/вертикали.
blockSize - размеры цветового прямоугольника
BRE, ага, я бы тоже одним голимым окошком обошёлся ) Задача - фигня
вот основу накидал, осталось только мышь приделать. Координаты прямоугольничков получаются из соответствующих функций
вот с мышью
я вчера, похоже, перепутал педали, когда менял файлы. Вот с мышью который должен был быть )))
Что-то у меня с курсором не получается. Там где указана стрелка, находится курсор. А прямоугольник обведен в другом месте. Вот картинка:
/// 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));
}
}
а у тебя вот тут точно правильно COLNUM и ROWNUM расставлены ?
for(uint i=0; i<COLNUM; ++i)
for(uint j=0; j<ROWNUM; ++j)
Самое смешное, что эту ошибку с 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;
}
AD, насколько я понимаю, у тебя передаётся winR с началом в точке 0,0. Координаты в 'p' тоже должны быть относительно этого начала координат выставлены. В общем, общая беда подобных функций - что приходится об этом гадать (и у меня в коде та же фигня, кстати. вышла) - нужно комментарий перед функцией написать, что относительно чего должно быть в параметрах. Через неделю уже забудешь ))
if(col >= COLNUM || row >= ROWNUM)
if(x >= XNUM || y >= YNUM)
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;
}
ассоциировать пару 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)