Здравствуйте, RussianFellow, Вы писали:
RF>А если мне не нужно создавать ресурсы с картинками, а рисовать, допустим, прямоугольник с большей или меньшей шириной (в зависимости от условия в программе)? Можно ли программно рисовать геометрические фигуры в QLabel? Если да, то как это сделать?
Еще подумалось, перейти всё таки на QTableView, а в модели через Qt::BackgroundRole возвращать QBrush с градиентом или трансформацией которая нужна
Здравствуйте, alpha21264, Вы писали:
A>Не ругайтесь на новичка. Рисовать через вызов события — это действительно неочевидно.
Так нужно разжевать суть:
Когда окно (виджет) становится видимым для пользователя
графическая подсистема (надстройка над OS — неважно Windows, Linux) вызывает в нашем приложении событие отрисовки (paintEvent).
В обработчике этого события — рисуем всё, что требуется видеть пользователю в нашем окне (виджете).
P.S. Если быть предельно точным — сказанное относится и к MFC, и к Qt.
Несмотря на то, раелизация (в "кишках" фреймворка Qt или в том же MFC) будет всё-таки различной.
RF>А если мне не нужно создавать ресурсы с картинками, а рисовать, допустим, прямоугольник с большей или меньшей шириной (в зависимости от условия в программе)? Можно ли программно рисовать геометрические фигуры в QLabel? Если да, то как это сделать?
Здравствуйте, RussianFellow, Вы писали:
RF>... RF>Есть некоторая таблица myTable типа QTableWidget. И в её клетках я хочу программно нарисовать какие-то рисунки. Как мне это сделать?
Рисование в клетке таблицы у меня работает. Для этого я создал класс QMyWidget, являющийся потомком класса QWidget, и класс QMyTableWidget, являющийся потомком класса QTableWidget. В этих двух классах я переопределил методы paintEvent.
Вот код:
struct cellinfo
{
int cellstate;
int beginpos;
int endpos;
bool isHighLine;
};
class QMyWidget : public QWidget
{
Q_OBJECT
public:
QMyWidget(QWidget* parent=0, Qt::WindowFlags f=0);
~QMyWidget();
cellinfo mycellinfo;
protected:
void paintEvent(QPaintEvent *);
};
void QMyWidget::paintEvent(QPaintEvent *e)
{
QRect rect, rect2;
QBrush *pBrush;
QWidget::paintEvent(e);
resize(40, 30);
QPainter painter(this);
rect = this->rect();
pBrush = new QBrush(QColor(128,128,128));
if (mycellinfo.cellstate==1)
{
rect2.setTop(rect.top()-2);
rect2.setBottom(rect.bottom()-1);
rect2.setLeft(rect.left+mycellinfo.beginpos);
rect2.setRight(rect.right());
painter.fillRect(rect2,*pBrush);
}
if (mycellinfo.cellstate==2)
{
rect2.setTop(rect.top()-2);
rect2.setLeft(rect.left());
rect2.setRight(rect.right());
rect2.setBottom(rect.bottom()-1);
painter.fillRect(rect2,*pBrush);
}
if (mycellinfo.cellstate==3)
{
rect2.setTop(rect.top()-2);
rect2.setBottom(rect.bottom()-1);
rect2.setLeft(rect.left());
rect2.setRight(rect.left()+mycellinfo.endpos);
painter.fillRect(rect2,*pBrush);
}
if (mycellinfo.cellstate==4)
{
rect2.setTop(rect.top()-2);
rect2.setBottom(rect.bottom()-1);
rect2.setLeft(rect.left+mycellinfo.beginpos);
rect2.setRight(rect.left()+mycellinfo.endpos);
painter.fillRect(rect2,*pBrush);
}
}
class QMyTableWidget : public QTableWidget
{
public:
explicit QMyTableWidget(QWidget *parent=nullptr);
QMyTableWidget(int rows, int columns, QWidget *parent=nullptr);
std::vector<cellinfo> cellattributes;
// . . .protected:
void paintEvent(QPaintEvent *);
}
void QMyTableWidget::paintEvent(QPaintEvent *e)
{
int i, n, rowcount;
QMyWidget* wgt;
QPainter painter(this);
cellinfo mycellinfo;
QBrush *pBrush;
QTableWidget::paintEvent(e);
pBrush = new QBrush(QColor(128,128,128));
rowcount = rowCount();
if (rowcount>0)
{
for (n=0; n<rowcount; n++)
{
// . . .for (i=1; i<=24; i++)
{
mycellinfo = (cellinfo)(cellattributes.at(n*25+i));
if (mycellinfo.cellstate!=0)
{
wgt = new QMyWidget();
wgt->mycellinfo.cellstate = mycellinfo.cellstate;
wgt->mycellinfo.beginpos = mycellinfo.beginpos;
wgt->mycellinfo.endpos = mycellinfo.endpos;
wgt->mycellinfo.isHighLine = mycellinfo.isHighLine;
wgt->repaint();
this->setCellWidget(n,i,wgt);
}
}
}
}
}
Здорово! Молодец!
Но все же лучше рисование отдельного виджета запихнуть в картинку и выводить уже картинку, и ее обновлять когда надо, а не каждый раз фигачить рисование с нуля.
Просто если у тебя будет таблица с миллионом ячеек и каждая будет себя отрисовывать — то все сдохнет.