1

好的,所以我已经使用 Qt 的拖放部分创建了我的 UI,并且在 Ui 中,我在另一个“Tab Widget”中创建了一个“Tab Widget”。现在,在第二个选项卡小部件中,我创建了一个框架

我的问题是,我如何在 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;

在我的 .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);
4

2 回答 2

2

如果您要在 QFrame 上绘制一些自定义形状,我建议您使用 QGraphicsView 而不是 QFrame。实现小部件的paintEvent 可能会产生性能问题。如果您使用 QGraphicsView,您可以创建一个 QGraphicsScene 并将您的项目添加到该场景中,这是执行此类操作的普遍且公认的方式。

或者,实现一个事件过滤器,如下所示,

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

在主窗口的构造函数中添加,

installEventFilter(this);

顺便说一句,您应该在paintEvent 函数中绘制椭圆之前设置您的笔。

于 2012-12-21T13:11:32.937 回答
1

似乎您正在覆盖主窗口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()父类的方法来绘制框架边框。

有关 SSCCE,请参阅https://github.com/afester/StackOverflow/tree/master/QtRepaint

于 2012-12-20T20:48:47.983 回答