Как рисовать на фрейме в Qt?

Итак, я создал свой пользовательский интерфейс с частью перетаскивания Qt, а в пользовательском интерфейсе я создал «Виджет вкладок» внутри другого «Виджета вкладок». Теперь во втором виджете со вкладками я создал рамку

Мой вопрос: как мне нарисовать поверх этого фрейма в Qt?

Я попробовал это, но не повезло вообще. Я пробовал по-разному, программа работает хорошо, но когда я иду и вижу, нарисован ли фрейм, я ничего не вижу … пожалуйста, помогите мне с этим, с примером кода и всем. Заранее спасибо.

void 2ndMainWindow::paintEvent(QPaintEvent *e)
{
QPainter paint(ui->rightTriangle_frame);
paint.drawEllipse(10,10,100,100);
paint.setPen(Qt::red);paint.end();
}

мой заголовочный файл включил это в частный слот

    Ui::GeometryMainWindow *ui;

QGraphicsScene *scene;
QGraphicsEllipseItem *ellipse;
QGraphicsRectItem *rectangle;
    ui->setupUi(this);

scene = new QGraphicsScene(this);
ui->graphicsView->setScene(scene);

QBrush redBrush(Qt::red);
QBrush blueBrush(Qt::blue);
QPen blackpen(Qt::black);
blackpen.setWidth(6);

ellipse = scene->addEllipse(10,10,100,100,blackpen,redBrush);

1

Решение

Если вы собираетесь рисовать некоторые настраиваемые фигуры в QFrame, я предлагаю вам использовать QGraphicsView вместо QFrame. Реализация paintEvent виджета может создать проблемы с производительностью. Если вы используете QGraphicsView, вы можете создать QGraphicsScene и добавить свои элементы в эту сцену, что является общим и общепринятым способом выполнения подобных вещей.

В качестве альтернативы, реализовать eventFilter, как показано ниже,

bool 2ndMainWindow::eventFilter(QObject *o, QEvent *e)
{
if (e->type() == QEvent::Paint) {
paintEvent((QPaintEvent *)e);
}
return QMainWindow::eventFilter(o, e);
}

В конструктор вашего главного окна добавить,

installEventFilter(this);

Кстати, вы должны установить перо, прежде чем рисовать свой эллипс в функции paintEvent.

2

Другие решения

Кажется, что вы переопределяете paintEvent() метод вашего главное окно и оттуда пытается нарисовать на рамке виджет. Посмотрите на вывод вашей консоли — вы должны получить сообщение вроде

QPainter::begin: Widget painting can only begin as a result of a paintEvent
QPainter::setPen: Painter not active
QPainter::end: Painter not active, aborted

Вместо этого подкласс вашего QFrame виджет (в конструкторе Qt выберите «Повышать до …» для определения пользовательского подкласса) и в этом подклассе переопределите paintEvent как это:

void MyFrame::paintEvent(QPaintEvent *e) {
QPainter paint(this);
paint.setPen(Qt::red);
paint.drawEllipse(10,10,100,100);

paint.end();
QFrame::paintEvent(e);
}

Обратите внимание, что для того, чтобы нарисовать красный эллипс, вам, конечно, нужно установить цвет пера перед рисованием эллипса. Вы также должны позвонить paintEvent() метод родительского класса для рисования границы рамки.

Увидеть https://github.com/afester/StackOverflow/tree/master/QtRepaint для SSCCE.

1

По вопросам рекламы [email protected]