Здравствуйте, RussianFellow, Вы писали:
RF>Есть некоторый виджет wgt типа QWidget. Как на нём осуществить рисование? (Рисование точек, линий, прямоугольников, закраска областей).
Вот так:
void myWidget::paintEvent(QPaintEvent *event )
{
QPainter Painter( this );
Painter.fillRect( 0,0,width(),height(),QColor(97,127,127) );
// Ещё чего-нибудь.
}
А потом так рраз!
MainWindow->myWidget->repaint();
И оно нарисовалось.
PS.
Не ругайтесь на новичка. Рисовать через вызов события — это действительно неочевидно.
Здравствуйте, Нomunculus, Вы писали:
A>>PS. A>>Не ругайтесь на новичка. Рисовать через вызов события — это действительно неочевидно.
Н>Действительно. Учитывая что вся работа на MFC на этом основана
Ну... Я MFC в последний раз видел в прошлом веке.
И... Я подозреваю, что там другие события.
Например, в прошлой версии Qt было необязательно делать myWidget->repaint();
Здравствуйте, Нomunculus, Вы писали:
Н>Здравствуйте, RussianFellow, Вы писали:
Н>Специально даже качнул книгу. Н>Глава 18.
Просмотрел, но там мало про это написано. Как я понимаю, надо использовать QLabel, которую потом надо вставлять в QWidget?
Нельзя ли тем не менее привести образец кода?
Нет. QLabel там для примера. Неужели сложно догадаться. Примеры кода приводить не буду. Тебе лень пальцем пощевелить, а других просишь работать за тебя. Привык что тебе все разжёвывают.
Здравствуйте, RussianFellow, Вы писали:
RF>Есть некоторый виджет wgt типа QWidget. Как на нём осуществить рисование? (Рисование точек, линий, прямоугольников, закраска областей).
Мне вот прям интересно стало, что такое ты хочешь сделать что нужно именно ручное рисование? Хотеслоь бы картинку увидеть, всё что мне приходит в голову это в telegram delegat-ы, там ручное рисование чтобы было быстро, для обычных случаем widget на стандартных элементах должен покрывать 95% случаем.
Здравствуйте, Igore, Вы писали:
I>Здравствуйте, RussianFellow, Вы писали:
RF>>Есть некоторый виджет wgt типа QWidget. Как на нём осуществить рисование? (Рисование точек, линий, прямоугольников, закраска областей). I>Мне вот прям интересно стало, что такое ты хочешь сделать что нужно именно ручное рисование? Хотеслоь бы картинку увидеть, всё что мне приходит в голову это в telegram delegat-ы, там ручное рисование чтобы было быстро, для обычных случаем widget на стандартных элементах должен покрывать 95% случаем.
Есть некоторая таблица myTable типа QTableWidget. И в её клетках я хочу программно нарисовать какие-то рисунки. Как мне это сделать?
Здравствуйте, RussianFellow, Вы писали:
RF>Есть некоторая таблица myTable типа QTableWidget. И в её клетках я хочу программно нарисовать какие-то рисунки. Как мне это сделать?
Здравствуйте, RussianFellow, Вы писали:
RF>Есть некоторая таблица myTable типа QTableWidget. И в её клетках я хочу программно нарисовать какие-то рисунки. Как мне это сделать?
Здравствуйте, RussianFellow, Вы писали:
RF>Есть некоторая таблица myTable типа QTableWidget. И в её клетках я хочу программно нарисовать какие-то рисунки. Как мне это сделать?
Берешь картинки и кладешь их в ресурсы, берешь QLabel устанавливаешь ему setPixmap, может еще и scaledContents, и устанавливаешь эту QLabel(или наследника) как виджет для ячейки, если нужна логика выделяешь как отдельный класс отнаследованный от QLabel и там всё прописываешь.
Здравствуйте, Igore, Вы писали:
I>Здравствуйте, RussianFellow, Вы писали:
RF>>Есть некоторая таблица myTable типа QTableWidget. И в её клетках я хочу программно нарисовать какие-то рисунки. Как мне это сделать? I>Берешь картинки и кладешь их в ресурсы, берешь QLabel устанавливаешь ему setPixmap
А если мне не нужно создавать ресурсы с картинками, а рисовать, допустим, прямоугольник с большей или меньшей шириной (в зависимости от условия в программе)? Можно ли программно рисовать геометрические фигуры в QLabel? Если да, то как это сделать?
Здравствуйте, RussianFellow, Вы писали:
RF>Вот я нашёл: RF>https://www.cyberforum.ru/qt/thread1967196.html
Да чтож ты всё ручками рисовать то хочешь
RF>А если мне не нужно создавать ресурсы с картинками, а рисовать, допустим, прямоугольник с большей или меньшей шириной (в зависимости от условия в программе)?
Берешь виджет, внутрь него помещаешь еще один виджет, выставляешь ему ширину, цвет и всё, а этот отдельный виджет помещаешь в ячейку
rootWidget
-rectangleWidget
а уж как внутренний виджет разположен в Layout или еще как чтобы размеры при resize нормально сделать это уже от нужного поведения зависит
Здравствуйте, 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);
}
}
}
}
}
Здорово! Молодец!
Но все же лучше рисование отдельного виджета запихнуть в картинку и выводить уже картинку, и ее обновлять когда надо, а не каждый раз фигачить рисование с нуля.
Просто если у тебя будет таблица с миллионом ячеек и каждая будет себя отрисовывать — то все сдохнет.