我如何在Qt中绘制框架?

时间:2012-12-20 19:32:19

标签: c++ qt drawing draw qpainter

好的,所以我用Qt的拖放部分创建了我的UI,在Ui我创建了一个" Tab Widget"在另一个" Tab Widget"。现在,在第二个Tab Widget里面我创建了一个Frame

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

2 个答案:

答案 0 :(得分:2)

如果您要在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函数中绘制椭圆之前设置笔。

答案 1 :(得分: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设计器中,选择“Promote to ...”来定义用户定义的子类),在这个子类中,覆盖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