在 Qt 中的小部件内部绘画

Posted

技术标签:

【中文标题】在 Qt 中的小部件内部绘画【英文标题】:painting inside widget in Qt 【发布时间】:2010-09-08 17:56:41 【问题描述】:

我创建了一个非常简单的 GUI,它有一个按钮和一个来自 Display Widgets 的“图形视图”小部件。按下按钮时,我希望在“图形视图”小部件上画一条线。通过在设计视图中右键单击小部件,然后选择更改 objectName,我已将“图形视图”小部件的名称更改为 gv。我无法理解应该如何画线。我阅读了关于 Qt 的各种文本,其中提供了有关 QPainter、PaintEvent 等的信息。但我更加困惑。

请帮我解决这个问题。因为我是 Qt 的新手,所以一个小的示例代码对我真的很有帮助。

【问题讨论】:

【参考方案1】:

QGraphicsView 用于显示由名为 QGraphicsScene 的组件管理的 QGraphicsItem 实例。在您的情况下,您将创建一个 QGraphicsLineItem 并将其添加到场景中,或者通过调用 QGraphicsScene 实例的 addLine 成员函数直接将其创建为场景的一个项目。

假设您确实正确连接了图形视图和场景,所有绘图都将由 Qt 自己完成。请务必阅读The Graphics View Framework,它为您概述了这些组件的工作原理。

您可以在此处找到有关如何使用图形视图框架管理和显示场景的代码示例:http://doc.trolltech.com/4.6/examples-graphicsview.html

【讨论】:

【参考方案2】:

你可以画成QPainter

覆盖paintevent并在那里绘制

void MyDisplayWidget::paintEvent(QPaintEvent*)

    QPainter p(this);   
    p.setPen(Qt::green);

    p.drawText(10,10,"hello");


或绘制到 QImage 中并显示它

QImage image = QImage(size);
QPainter p(&image);
p.drawText(10,10,"hello");
// draw or save QImage 

您甚至可以使用相同的绘制函数,使用 QPainter * 直接绘制到屏幕或图像。

【讨论】:

我创建了一个小部件 MyDisplayWidget。但是我使用 Qt 的拖放功能设计了一个表单 mainwindow.ui。如何在该 gui 中包含这个新小部件? 要在 Qt 的设计器应用程序中使用自定义小部件,需要进行大量编码。如果您想在主窗口中使用自定义小部件,请使用设计器应用程序放置占位符小部件(或框架),然后在主窗口的代码中,创建自定义小部件的实例并将其添加到占位符. @nishant-4545:推广小部件是完成工作的快速方法。见doc.trolltech.com/4.6/designer-using-custom-widgets.html @Arnold Spence - 抱歉,这不是一个在按钮上画线的好例子。我正在使用它将视频绘制到 GLWidget 不用担心。在他提到他正在使用 Qt 的 Designer 之后,我只是想为 OP 填写一些附加信息:)【参考方案3】:

首先您必须了解一些关于 QPainter 的信息才能从中受益。

QPainter 提供高度优化的功能来完成大多数绘图 GUI 程序所需的工作。它可以绘制从简单的图形基元(由 QPoint、QLine、QRect、QRegion 和 QPolygon 类表示)到矢量路径等复杂形状的所有内容。我们用它来绘制绘图设备 然后渲染它以查看,我们有很多 qpaint 设备,例如:QWidget、QImage、QPixmap、QPicture、QPrinter 和 QOpenGLPaintDevice,您可以根据您的要求使用其中任何一种,然后创建 QGraphic 场景并将您的绘画设备添加为 qgraphic 场景要在 qgraphic 视图中显示的项目。

这里是简单的代码:

Widget::Widget(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::Widget)

    ui->setupUi(this);
    scene=new QGraphicsScene(this); //allocate your scene to your main widget
    view=new QGraphicsView(scene,this);//here is your view
    pixmap=new QPixmap(QSize(700,700));// paint device
    view->resize(700,700);



Widget::~Widget()

    delete ui;


void Widget::paintEvent(QPaintEvent *e)

    painter=new QPainter;// create your painter
    painter->begin(pixmap);//add painter to your paint device

    painter->fillRect(0,0,300,300,Qt::red);//draw rect
    painter->setPen(Qt::yellow);
    painter->drawLine(0,0,700,700);//draw line
    painter->end();
    scene->addPixmap(*pixmap);// add your paint device to your scene
    view->show();//then show your view

 

【讨论】:

以上是关于在 Qt 中的小部件内部绘画的主要内容,如果未能解决你的问题,请参考以下文章

QT 绘画到小部件

QT5.4 删除和删除布局中的小部件

Qt 中的样式表、隐藏的小部件和大小

如何计算存储在 Gtk::Grid 中的小部件?

Qt - 如何控制 QLayout 中的小部件大小

如何关闭在提升的小部件中单击的按钮上的 qt 小部件 ui?