Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 在Qt中绘制内部小部件_C++_Qt - Fatal编程技术网

C++ 在Qt中绘制内部小部件

C++ 在Qt中绘制内部小部件,c++,qt,C++,Qt,我创建了一个非常简单的GUI,它有一个按钮和一个来自显示小部件的“图形视图”小部件。按下按钮时,我希望在“图形视图”小部件上画一条线。我已经将“图形视图”小部件的名称更改为gv,方法是在设计视图中右键单击该小部件,然后选择ChangeObjectName。我不明白这条线该怎么画。我在Qt上阅读了各种文本,这些文本提供了关于QPainter、PaintEvent等的信息,但我更困惑了 请帮我做这个。一个小样本代码对我来说真的很有帮助,因为我是Qt新手。您可以在QPainter中绘制 覆盖paint

我创建了一个非常简单的GUI,它有一个按钮和一个来自显示小部件的“图形视图”小部件。按下按钮时,我希望在“图形视图”小部件上画一条线。我已经将“图形视图”小部件的名称更改为gv,方法是在设计视图中右键单击该小部件,然后选择ChangeObjectName。我不明白这条线该怎么画。我在Qt上阅读了各种文本,这些文本提供了关于QPainter、PaintEvent等的信息,但我更困惑了


请帮我做这个。一个小样本代码对我来说真的很有帮助,因为我是Qt新手。

您可以在QPainter中绘制

覆盖paintevent并在其中绘制

void MyDisplayWidget::paintEvent(QPaintEvent*)
{
    QPainter p(this);   
    p.setPen(Qt::green);

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

}
或者画成一个图像并显示它

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

您甚至可以使用与使用QPaint*相同的绘图功能直接绘制屏幕或图像。

QGraphicsView用于显示QGraphicsSitem的实例,这些实例由名为QGraphicsCenter的组件管理。在您的情况下,您可以创建一个并将其添加到场景中,或者通过调用QGraphicscene实例的成员函数直接将其创建为场景的一项

假设您正确连接了图形视图和场景,所有绘图都将由Qt自己完成。请务必阅读,这将为您提供有关这些组件如何工作的概述


您将在此处找到如何使用图形视图框架管理和显示场景的代码示例:

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

} 

我创建了一个小部件MyDisplayWidget。但是我使用Qt的拖放功能设计了一个表单mainwindow.ui。如何在gui中包含这个新的小部件?要在Qt的designer应用程序中使用自定义小部件,需要进行大量的编码。如果要在主窗口中使用自定义小部件,请使用designer应用程序放置占位符小部件(或框架),然后在主窗口的代码中,创建自定义小部件的实例并将其添加到占位符中。@nishant-4545:升级小部件是完成工作的快速方法。请看@Arnold Spence-抱歉,这不是一个在按钮上画线的好例子。我用它把视频画进了一个GLWIDGETHET,不用担心。在他提到他正在使用Qt的设计器之后,我只是想为OP补充一些额外的信息:)