在Qt中绘制内部小部件

时间:2010-09-08 17:56:41

标签: c++ qt

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

请帮助我。一个小的示例代码对我来说真的很有用,因为我是Qt的新手。

3 个答案:

答案 0 :(得分:4)

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

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

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

答案 1 :(得分:3)

你可以画成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 *直接绘制到屏幕或图像上。

答案 2 :(得分:-1)

首先,您必须了解有关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

}