如何在QT中的框架上绘制

How do i Draw on a Frame in Qt?

本文关键字:框架 绘制 QT      更新时间:2023-10-16

好的,所以我已经用qt的拖放部分创建了我的UI,在UI中,我在另一个" Tab Widteg"中创建了一个" Tab Widget"。现在,在第二个标签小部件内部我创建了一个帧

我的问题是,我该如何在QT中的此框架上绘制?

我尝试过,但根本没有运气。IVE尝试了不同的方法,该程序运行良好,但是当我去看看框架是否被绘制时,我什么也看不到...请帮助我,以代码示例等。预先感谢。

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;

在我的.cpp文件中我做了

    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);

如果要在qframe上绘制一些自定义形状,我建议您使用qgraphicsview而不是qframe。实现小部件的油漆可能会造成性能问题。如果您使用QgraphicsView,则可以创建一个QgraphicsScene,并将您的项目添加到该场景中,这是做这种事情的一般且接受的方法。

或者,以下实现事件过滤器,

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

在您的MainWindow的构造函数中,

installEventFilter(this);

顺便说一句,您应该在绘制PaintEvent功能中绘制椭圆之前设置笔。

看来,您正在覆盖主窗口的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 widget(在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/afest/stackoverflow/tree/master/qtrepaint for SSCCE。