QtGraphicView添加图元

最近一段时间一直在学习Qt的相关内容,Qt入门相对还简单,但精通确不那么容易。有句话叫功到自然成,那就一点一点积累吧。

Qt中有关场景和视图的介绍,根据这个框架可以非常方便的搭建一些动画等。

本次的实例就是如何添加图元,先看下效果:
在这里插入图片描述
QtCreator 可以方便地添加 GraphicsWidget 、lable、button、lineEdit。这些控件。先将这些控件在主窗口中布局好。

下面是mainwindow.h 的内容:

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include<QGraphicsScene>

QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACE

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    MainWindow(QWidget *parent = nullptr);
    ~MainWindow();

    void slotAddEllipseItem(int x, int y);
    void slotAddPolygonItem(int x,int y);
    void slotAddRectItem(int x,int y) ;
    void slotAddTextItem(QString str)  ;

private slots:
    void on_actionnew_triggered();

    void on_actionexit_triggered();

    void on_addPolygon_clicked();

    void on_clear_clicked();

    void on_addEllipse_clicked();

    void on_addRectangle_clicked();

    void on_addText_clicked();

private:
    Ui::MainWindow *ui;

    QGraphicsScene *originalScene;

    int px;  //坐标
    int py;
};
#endif // MAINWINDOW_H

该头文件定义了实现添加图元的方法,定义了按钮单击的信号槽。

再看具体的mainwindow.cpp的内容:


```cpp
#include "mainwindow.h"
#include "ui_mainwindow.h"

#include<QGraphicsEllipseItem>

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);

    setWindowTitle(tr("Graphics Items"));

    originalScene =new QGraphicsScene(this);

    ui->graphicsView->setScene(originalScene);
  //设置场景的前景色
    ui->graphicsView->setForegroundBrush(QColor(255,255,0,100));
  //设置场景的背景图片
    ui->graphicsView->setBackgroundBrush(QPixmap("../graph_03/background.png"));

    ui->graphicsView->show();

  //  slotAddEllipseItem();
}

MainWindow::~MainWindow()
{
    delete ui;

}


void MainWindow::on_actionnew_triggered()
{
    QList<QGraphicsItem*> listItem = originalScene->items();
    while(!listItem.empty())
    {
        originalScene->removeItem(listItem.at(0));
        listItem.removeAt(0);
    }

}

void MainWindow::on_actionexit_triggered()
{
    close();
}

void MainWindow::slotAddEllipseItem(int x, int y)	//在场景中加入一个椭圆形图元
{
    QGraphicsEllipseItem *item = new QGraphicsEllipseItem(QRectF(0,0,80, 60));
    item->setPen(Qt::NoPen);
    item->setBrush(QColor(qrand()%256,qrand()%256,qrand()%256));
    item->setFlag(QGraphicsItem::ItemIsMovable);
    originalScene->addItem(item);
    item->setPos(x,
                 y);
}

void MainWindow::slotAddPolygonItem(int x,int y)  	//在场景中加入一个多边形图元
{
    QVector<QPoint> v;
    v<<QPoint(30,-15)<<QPoint(0,-30)<<QPoint(-30,-15)
            <<QPoint(-30,15)<<QPoint(0,30)<<QPoint(30,15);
    QGraphicsPolygonItem *item = new QGraphicsPolygonItem(QPolygonF(v));
    item->setBrush(QColor(qrand()%256,qrand()%256,qrand()%256));
    item->setFlag(QGraphicsItem::ItemIsMovable);
    originalScene->addItem(item);
    item->setPos(x,y);
}



void MainWindow::slotAddRectItem(int x,int y)          //在场景中加入一个长方形图元
{
    QGraphicsRectItem *item = new QGraphicsRectItem(QRectF(0,0, 60,60));
    QPen pen;
    pen.setWidth(3);
    pen.setColor(QColor(qrand()%256,qrand()%256,qrand()%256));
    item->setPen(pen);
    item->setBrush(QColor(qrand()%256,qrand()%256,qrand()%256));
    item->setFlag(QGraphicsItem::ItemIsMovable);
    originalScene->addItem(item);
    item->setPos(x,y);
}


void MainWindow::slotAddTextItem(QString str)  		//在场景中加入一个文字图元
{
    QFont font("Times",16);
    QGraphicsTextItem *item = new QGraphicsTextItem(str);
    item->setFont(font);
    item->setFlag(QGraphicsItem::ItemIsMovable);
    item->setDefaultTextColor(QColor(qrand()%256,qrand()%256,qrand ()%256));
    originalScene->addItem(item);
    item->setPos((qrand()%int(originalScene->sceneRect().width()))-200,
                 (qrand()%int(originalScene->sceneRect().height()))-200);
}


void MainWindow::on_addPolygon_clicked()
{
    px=ui->lineEdit->text().toInt();
    py=ui->lineEdit_2->text().toInt();
    slotAddPolygonItem(px,py);

}

void MainWindow::on_clear_clicked()
{
    QList<QGraphicsItem*> listItem = originalScene->items();
    while(!listItem.empty())
    {
        originalScene->removeItem(listItem.at(0));
        listItem.removeAt(0);
    }
}

void MainWindow::on_addEllipse_clicked()
{
    px=ui->lineEdit->text().toInt();
    py=ui->lineEdit_2->text().toInt();
    slotAddEllipseItem(px, py);
}

void MainWindow::on_addRectangle_clicked()
{
    px=ui->lineEdit->text().toInt();
    py=ui->lineEdit_2->text().toInt();
    slotAddRectItem(px,py);
}

void MainWindow::on_addText_clicked()
{
    QString str= ui->lineEdit_3->text();
    slotAddTextItem(str);
}

Qt的场景视图框架相对还是简单,但是要灵活运用,还是需要多多操练啊。

下载链接:
//download.csdn.net/download/qq_21291397/12246131

原创文章 41 获赞 0 访问量 2043

猜你喜欢

转载自blog.csdn.net/qq_21291397/article/details/104837409