【问题标题】:How do i Draw on a Frame in Qt?我如何在 Qt 中的框架上绘图?
【发布时间】:2012-12-20 19:32:19
【问题描述】:

好的,所以我已经使用 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);

【问题讨论】:

    标签: c++ qt drawing draw qpainter


    【解决方案1】:

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

    【讨论】:

    • 我试过这个,但是用另一种方法代替,它完全按照我想要的方式工作,非常感谢 =) scene = new QGraphicsScene(this); ui->graphicsView->setScene(场景); QBrush redBrush(Qt::red); QBrush blueBrush(Qt::blue); QPen bluepen(Qt::black); bluepen.setWidth(6);椭圆 = 场景->addEllipse(10,10,100,100,bluepen,redBrush);标题是 QGraphicsScene *scene; QGraphicsEllipseItem *椭圆; QGraphicsRectItem *矩形;我并没有真正按照你说的做,但我确实使用了 hraphics 视图,这对我有很大帮助,谢谢
    【解决方案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() 方法来绘制框架边框。

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

    【讨论】:

    • 我一个字一个字地跟着你说的,我现在得到这个错误,错误:C2143:语法错误:缺少';'在“*”和错误之前:C4430:缺少类型说明符 - 假定为 int。注意:C++ 不支持 default-int 它说因为不是 QWidget *Right_Triangle_Tab; (像其他所有东西一样被声明为 QWidget)现在它显示如下,rightTriangle_frame *rightTriangle_frame;我试着做 QFrame rightTriangle_frame *rightTriangle_frame;但它不起作用....我该怎么办?
    • 你应该将你的类rightTriangle_frame(在Qt设计器中)重命名为RightTriangleFrame,并在你的项目中添加一个RightTriangleFrame.cpp和一个RightTriangleFrame.h文件。在这个文件中,实现class RightTriangleFrame : public QFrame。从我的答案中的链接中查看MyFrame.cpp / MyFrame.h 文件。
    • 我已经完成了所有这些,我修复了那个错误,我现在没有错误但我仍然看不到框架顶部的绘图 =(,这里一定有一些东西我丢失了。 ..我只是不知道它是什么
    • 您能否将代码缩减到重现问题所需的最低限度并在您的问题中发布相关部分? (可能最好发布一个新问题,以免污染这个问题)
    猜你喜欢
    • 2011-04-07
    • 2018-01-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-18
    • 2011-10-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多