Re[5]: Как рисовать на виджете?
От: Igore Россия  
Дата: 09.09.22 07:59
Оценка:
Здравствуйте, RussianFellow, Вы писали:

RF>А если мне не нужно создавать ресурсы с картинками, а рисовать, допустим, прямоугольник с большей или меньшей шириной (в зависимости от условия в программе)? Можно ли программно рисовать геометрические фигуры в QLabel? Если да, то как это сделать?


Еще подумалось, перейти всё таки на QTableView, а в модели через Qt::BackgroundRole возвращать QBrush с градиентом или трансформацией которая нужна
Re[2]: Как рисовать на виджете?
От: AlexGin Беларусь  
Дата: 10.09.22 08:34
Оценка:
Здравствуйте, alpha21264, Вы писали:

A>Не ругайтесь на новичка. Рисовать через вызов события — это действительно неочевидно.


Так нужно разжевать суть:
Когда окно (виджет) становится видимым для пользователя
графическая подсистема (надстройка над OS — неважно Windows, Linux) вызывает в нашем приложении событие отрисовки (paintEvent).
В обработчике этого события — рисуем всё, что требуется видеть пользователю в нашем окне (виджете).

P.S. Если быть предельно точным — сказанное относится и к MFC, и к Qt.
Несмотря на то, раелизация (в "кишках" фреймворка Qt или в том же MFC) будет всё-таки различной.
Отредактировано 11.09.2022 7:25 AlexGin . Предыдущая версия . Еще …
Отредактировано 10.09.2022 8:50 AlexGin . Предыдущая версия .
Отредактировано 10.09.2022 8:40 AlexGin . Предыдущая версия .
Отредактировано 10.09.2022 8:36 AlexGin . Предыдущая версия .
Re[4]: Как рисовать на виджете?
От: AlexGin Беларусь  
Дата: 10.09.22 08:47
Оценка: -1
Здравствуйте, alpha21264, Вы писали:

A>И... Я подозреваю, что там другие события.


Если мы говорим об MFC, то там за события отвечает Windows API.
Для Qt — OpenGL.

Для прикладного программиста — это то, от чего (для простой отрисовки) можно абстрагироваться.
Re[5]: Как рисовать на виджете?
От: DiPaolo Россия  
Дата: 10.09.22 09:53
Оценка: +1
RF>А если мне не нужно создавать ресурсы с картинками, а рисовать, допустим, прямоугольник с большей или меньшей шириной (в зависимости от условия в программе)? Можно ли программно рисовать геометрические фигуры в QLabel? Если да, то как это сделать?

Тут уже отвечали же на этот твой вопрос.

Ты прогресс бар, я так понимаю, хочешь рисовать? Тогда вставляй QProgressBar (https://doc.qt.io/qt-6/qprogressbar.html) в качестве виджета в айтем таблицы (https://doc.qt.io/qt-6/qtablewidget.html#setCellWidget).
Патриот здравого смысла
Re[5]: Как рисовать на виджете?
От: Shtole  
Дата: 10.09.22 11:27
Оценка:
Здравствуйте, RussianFellow, Вы писали:

RF>Вот код (рисование прямоугольника):


RF>
RF>QWidget *myWidget;

RF>// ...

RF>QPainter* myPainter = new QPainter(myWidget);
RF>myPainter->begin(myWidget);
RF>myPainter->setRenderHint(QPainter::Antialiasing);
RF>myPainter->setBrush(QColor(255,255,255));
RF>myPainter->drawRect(0,0,wyWidget->width(),myWidget->height());
RF>myPainter->end();
RF>


RF>В этом коде всё правильно?


Как сказал Лев Толстой, все контексты устройств похожи друг на друга.
Do you want to develop an app?
Re[3]: Как рисовать на виджете?
От: SaZ  
Дата: 12.09.22 12:32
Оценка:
Здравствуйте, RussianFellow, Вы писали:

RF>...

RF>Есть некоторая таблица myTable типа QTableWidget. И в её клетках я хочу программно нарисовать какие-то рисунки. Как мне это сделать?

Вот я когда-то писал делегат для рисования в ячейках. В делегате есть QPainter — с ним можно уже делать что хочешь.
https://stackoverflow.com/a/16301316/1035613
Re: Как рисовать на виджете?
От: RussianFellow Россия http://russianfellow.livejournal.com
Дата: 07.10.22 11:22
Оценка:
Рисование в клетке таблицы у меня работает. Для этого я создал класс 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);
                }
            }
        }
    }
}

В результате у меня всё работает!
1613 г. = 2024 г.
Re[2]: Как рисовать на виджете?
От: Нomunculus Россия  
Дата: 07.10.22 11:25
Оценка:
Здравствуйте, RussianFellow, Вы писали:

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