最近一段时间一直在学习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