常用窗口api
#ifndef DIALOG_H
#define DIALOG_H
#include <QDialog>
#include <QLabel>
#include <QGridLayout>
class Dialog : public QDialog
{
Q_OBJECT
public:
Dialog(QWidget *parent = nullptr);
~Dialog();
private:
QGridLayout *layout;
QLabel *label1;
QLabel *label1_1;
QLabel *label2;
QLabel *label2_1;
QLabel *label3;
QLabel *label3_1;
QLabel *label4;
QLabel *label4_1;
QLabel *label5;
QLabel *label5_1;
//窗口大小变化事件
void resizeEvent(QResizeEvent *event) override;
//窗口移动事件
void moveEvent(QMoveEvent *event) override;
public:
//更新标签内容
void updateLabel();
};
#endif // DIALOG_H
#include "dialog.h"
Dialog::Dialog(QWidget *parent)
: QDialog(parent)
{
this->setWindowTitle("窗体常用api");
this->resize(300,200);
layout=new QGridLayout(this);
label1=new QLabel("geometry:");
label1_1=new QLabel();
label2=new QLabel("width:");
label2_1=new QLabel();
label3=new QLabel("height:");
label3_1=new QLabel();
label4=new QLabel("rect:");
label4_1=new QLabel();
label5=new QLabel("size:");
label5_1=new QLabel();
layout->addWidget(label1,0,0);
layout->addWidget(label1_1,0,1);
layout->addWidget(label2,1,0);
layout->addWidget(label2_1,1,1);
layout->addWidget(label3,2,0);
layout->addWidget(label3_1,2,1);
layout->addWidget(label4,3,0);
layout->addWidget(label4_1,3,1);
layout->addWidget(label5,4,0);
layout->addWidget(label5_1,4,1);
updateLabel();
}
//窗口大小变化事件
void Dialog::resizeEvent(QResizeEvent *event) {
updateLabel();
}
//窗口移动事件
void Dialog::moveEvent(QMoveEvent *event){
updateLabel();
}
void Dialog::updateLabel(){
QString str;
QString str1;
QString str2;
QString str3;
QString str4;
str1.setNum(this->geometry().x());//它描述了窗口部件在屏幕上的实际矩形区域。
str2.setNum(this->geometry().y());
str3.setNum(this->geometry().width());
str4.setNum(this->geometry().height());
str=str1+" "+str2+" "+str3+" "+str4;
label1_1->setText(str);
QString strw,strh;
label2_1->setText(strw.setNum(this->width()));
label3_1->setText(strh.setNum(this->height()));
QString strrect;
//rect函数返回的是窗口的位置和大小 它描述了窗口部件客户区的矩形区域。
strrect.setNum(this->rect().x());
strrect.append(" ");
strrect.append(strw.setNum(this->rect().y()));
strrect.append(" ");
strrect.append(strw.setNum(this->rect().width()));
strrect.append(" ");
strrect.append(strh.setNum(this->rect().height()));
label4_1->setText(strrect);
QString strsize;
strsize.setNum(this->size().width());
strsize.append(" ");
strsize.append(strh.setNum(this->size().height()));
label5_1->setText(strsize);
}
Dialog::~Dialog() {}
绘图框架设计 Qpainter
/**
* Created by gopher on 24-8-17 下午3:50
*/
#ifndef Q65_PAINTERAREA_H
#define Q65_PAINTERAREA_H
#include <QWidget>
#include <QPen> //这个类是用来画线的提供了一些画线的函数
#include <QBrush> //画刷这个类用来,设置颜色和填充模式
#include <QColor>
#include <QRect>
#include <QPainter>
class painterArea : public QWidget{
Q_OBJECT
public:
painterArea(QWidget *parent = nullptr);
~painterArea();
enum shape{Line,//线形
rectangles,// 矩形
circles,// 圆形
ellipses,// 椭圆
polygons};// 多边形
void setShape(shape s); //设置形状
void setPen(QPen p); //设置画笔
void setBrush(QBrush b); //设置画刷
void paintEvent(QPaintEvent *event) override; //重写paintEvent方法 绘制事件
void setfillrule(Qt::FillRule rule); //设置填充颜色
private:
shape currentShape; //当前形状
QPen pen; //画笔
QBrush brush; //画刷
Qt::FillRule fillRule; //填充规则
};
#endif //Q65_PAINTERAREA_H
/**
* Created by gopher on 24-8-17 下午3:50
*/
#include "painterArea.h"
painterArea::painterArea(QWidget *parent) : QWidget(parent){
this->setPalette(QPalette(Qt::white));//设置背景颜色
this->setAutoFillBackground(true);//设置自动填充背景
this->setMinimumSize(400, 500);//设置最小尺寸
}
void painterArea::setShape(shape s){
currentShape=s;
this->update();
} //设置形状
void painterArea::setPen(QPen p){
pen=p;
this->update();
} //设置画笔
void painterArea::setBrush(QBrush b){
brush=b;
this->update();
} //设置画刷
void painterArea::paintEvent(QPaintEvent *event) {
QPainter painter(this);
painter.setPen(pen);
painter.setBrush(brush);
QRect rect(100, 100, 200, 200);
switch(currentShape){
case Line://画线
painter.drawLine(rect.topLeft(), rect.bottomRight());
break;
case rectangles://画矩形
painter.drawRect(rect);
break;
default:
break;
}
}
void painterArea::setfillrule(Qt::FillRule rule){
fillRule=rule;
this->update();//更新界面
} //设置填充颜色
painterArea::~painterArea(){}
#ifndef WIDGET_H
#define WIDGET_H
#include <QWidget>
#include <QLabel>
#include <QComboBox>
#include <QGridLayout>
#include "painterArea.h"
class Widget : public QWidget
{
Q_OBJECT
public:
Widget(QWidget *parent = nullptr);
~Widget();
private:
painterArea *mypainterArea;
QLabel *label;
QComboBox *comboBox;
QGridLayout *layout;
public slots:
void change(int index);
};
#endif // WIDGET_H
#include "widget.h"
#include "painterArea.h"
Widget::Widget(QWidget *parent)
: QWidget(parent)
{
mypainterArea=new painterArea;
layout=new QGridLayout;
comboBox=new QComboBox;
this->setWindowTitle("绘图测试");
label=new QLabel("请选择画笔颜色:");
comboBox->addItem("Line",painterArea::Line);
comboBox->addItem("Rect",painterArea::rectangles);
layout->addWidget(mypainterArea,0,0,1,2);
layout->addWidget(label,1,0);
layout->addWidget(comboBox,1,1);
this->setLayout(layout);
connect(comboBox,SIGNAL(currentIndexChanged(int)),
this,SLOT(change(int)));
}
Widget::~Widget() {}
void Widget::change(int index){
painterArea::shape sp= painterArea::shape(comboBox->itemData(index,Qt::UserRole).toInt());
mypainterArea->setShape(sp);
}
绘图双缓冲机制
Q66项目
GraphicsView 绘图框架设计
GraphicsView 是 Qt 框架中的一个类,用于显示和交互二维图形项(QGraphicsItem)。它提供了一个高级的、可缩放的视图,适用于需要复杂图形界面和交互的应用程序,如图形编辑器、地图查看器等。
QObject
↑
QWidget
↑
QFrame
↑
QGraphicsView
关键特性
缩放和滚动:支持通过鼠标或编程方式进行缩放和滚动。
图形项:可以添加各种图形项,如矩形、椭圆、文本等。
事件处理:支持鼠标、键盘等事件的处理。
碰撞检测:可以检测图形项之间的碰撞。
分组和层次:支持图形项的分组和层次管理。
主要类和方法
QGraphicsView:视图类,用于显示 QGraphicsScene 中的内容。
setScene(scene): 设置要显示的场景。
setDragMode(mode): 设置拖动模式,如平移、选择等。
scale(sx, sy): 缩放视图。
QGraphicsScene:场景类,管理图形项。
addItem(item): 添加图形项到场景中。
removeItem(item): 从场景中移除图形项。
items(): 获取场景中的所有图形项。
QGraphicsItem:图形项基类,有许多子类如 QGraphicsRectItem, QGraphicsEllipseItem, QGraphicsTextItem 等。
setPos(x, y): 设置图形项的位置。
setBrush(brush): 设置填充颜色。
setPen(pen): 设置边框颜色和样式。
QGraphicsScene 是 Qt 中用于管理大量二维图形项(如线条、矩形、文本等)的类。它提供了一个场景,可以在其中添加、删除和管理这些图形项。QGraphicsScene 本身并不直接负责绘制这些图形项,而是通过 QGraphicsView 来显示和交互。
QGraphicsView 是 Qt 中用于显示 QGraphicsScene 内容的类。它提供了一个视图窗口,可以在其中显示和交互场景中的图形项。QGraphicsView 支持缩放、平移和旋转等操作,并且可以处理用户输入事件。
QGraphicsItem 是 Qt 中用于表示图形场景中可绘制对象的基类。它是所有图形项的抽象基类,提供了基本的绘图、事件处理和变换功能。通过继承 QGraphicsItem,可以创建自定义的图形项,并在 QGraphicsScene 中使用。
示例: 图片缩放倾斜旋转
#ifndef PIXITEM_H
#define PIXITEM_H
#include <QGraphicsItem> //图元类
#include <QPixmap>//位图类
#include<QPainter>//画笔类
class PixItem : public QGraphicsItem
{
public:
PixItem(QPixmap *pix);
private:
QPixmap pix; //位图对象
public:
//返回图元的边界矩形
QRectF boundingRect() const override;
//绘制图元
//@Param painter 画笔对象
//@Param option 样式选项
//@Param widget 绘制的窗口
void paint(QPainter *painter,
const QStyleOptionGraphicsItem *option,
QWidget *widget) override;
};
#endif // PIXITEM_H
#include "pixitem.h"
#include <QGraphicsItem> //图元类
#include <QPixmap>//位图类
#include<QPainter>//画笔类
//构造函数
//@Param pixmap 位图对象
PixItem::PixItem(QPixmap *pixmap) {
pix = *pixmap; //设置位图
}
//返回图元的边界矩形
QRectF PixItem::boundingRect() const {
//返回位图的矩形
//@Param x 矩形左上角x坐标
//@Param y 矩形左上角y坐标
//@Param w 矩形宽度
//@Param h 矩形高度
return QRectF(-2-pix.width() / 2, -2-pix.height() / 2, pix.width()+4, pix.height()+4);
};
//绘制图元
//@Param painter 画笔对象
//@Param option 样式选项
//@Param widget 绘制的窗口
void PixItem::paint(QPainter *painter,
const QStyleOptionGraphicsItem *option,
QWidget *widget) {
//绘制位图
//@Param x 绘制左上角x坐标
//@Param y 绘制左上角y坐标
//@Param pixmap 位图对象
painter->drawPixmap(-pix.width() / 2, -pix.height() / 2, pix);//此时-pix.width() / 2, -pix.height() / 2, pix表示位图绘制的位置
};
#ifndef WIDGET_H
#define WIDGET_H
#include <QWidget>
#include <QGraphicsScene>//图形场景
#include <QGraphicsView>//图形视图
#include <QFrame>//框架
#include <QHBoxLayout>//水平布局
#include <QVBoxLayout>//垂直布局
#include <QSlider>//滑动条
#include <QGroupBox>//组合框
#include "pixitem.h"//自定
#include <QPushButton>//按钮
#include <QLabel>
class Widget : public QWidget
{
Q_OBJECT
public:
Widget(QWidget *parent = nullptr);
~Widget();
public:
void CreateControlFrame();//创建控制面板
private:
int iAngle;//旋转角度
qreal scalevalue;//缩放比例
qreal skewvalue;//倾斜比例
QSlider *rotateslider;//旋转滑动条
QSlider *scaleslider;//缩放滑动条
QSlider *skewslider;//倾斜滑动条
QGraphicsView *view;//图形视图
QFrame *controlFrame;//控制面板
PixItem *pixItem;//图片项
private slots:
void rotateFunc(int angle);//旋转
void scaleFunc(int value);//缩放
void skewFunc(int value);//倾斜
void resetFunc();//重置
};
#endif // WIDGET_H
#include "widget.h"
Widget::Widget(QWidget *parent)
: QWidget(parent)
{
setWindowTitle("图形视图框架");
iAngle = 0;//旋转角度
scalevalue = 1;//缩放比例
skewvalue = 0;//倾斜角度
//场景
QGraphicsScene *scene = new QGraphicsScene();//创建场景
//添加图形
QString pat("C://Users//gophe//OneDrive//图片//螢幕擷取畫面//1.png");
QPixmap *pixmap= new QPixmap(pat);
//自定类
pixItem= new PixItem(pixmap);
//添加到场景
scene->addItem(pixItem);
//设置在pixItem场景中的位置
pixItem->setPos(0,0);//设置位置
//视图
view= new QGraphicsView;
view->setScene(scene);//设置场景
//设置scene位置
view->setMinimumSize(400, 400);//设置最小尺寸
//设置对齐方式
view->setAlignment(Qt::AlignLeft | Qt::AlignTop|Qt::AlignHCenter|Qt::AlignVCenter);
//设置背景颜色
view->setBackgroundBrush(QBrush(Qt::white));
//控制面板
controlFrame=new QFrame;
//添加控件
CreateControlFrame();
//设置布局
QHBoxLayout *mainLayout = new QHBoxLayout;//创建布局
mainLayout->addWidget(view);//添加视图
mainLayout->addWidget(controlFrame);//添加控制面板
setLayout(mainLayout);//设置整体布局
}
Widget::~Widget() {}
void Widget::rotateFunc(int angle) {
view->rotate(angle-iAngle);//调用了视图的旋转方法
iAngle = angle;//更新旋转角度
}
//缩放
void Widget::scaleFunc(int value){
qreal factor ;
if (value>scalevalue){//如果放大
factor=pow(1.1,value-scalevalue); //计算放大比例
}else{
factor=pow(1/1.1,scalevalue-value); //计算缩小比例
}
view->scale(factor,factor);//调用了视图的缩放方法
scalevalue = value;//更新缩放比例
}
//倾斜
void Widget::skewFunc(int value){
qreal angle = value*1.0/180*M_PI; //计算倾斜角度
view->shear(angle-skewvalue,0);//调用了视图的倾斜方法
skewvalue = angle;//更新倾斜角度
}
//重置
void Widget::resetFunc(){
view->resetTransform();//调用了视图的重置方法
iAngle = 0;//旋转角度
scalevalue = 1;//缩放比例
skewvalue = 0;//倾斜角度
//更新控件
rotateslider->setValue(0);
scaleslider->setValue(1);
skewslider->setValue(0);
}
//创建控制面板
void Widget::CreateControlFrame(){
QLabel *rotatelabel = new QLabel("旋转");
QLabel *scalelabel = new QLabel("缩放");
QLabel *skewlabel = new QLabel("倾斜");
//旋转
rotateslider = new QSlider;
rotateslider->setOrientation(Qt::Horizontal);//水平方向
rotateslider->setMinimum(-360);//最小值
rotateslider->setMaximum(360);最大值
rotateslider->setValue(0);//初始值
connect(rotateslider, SIGNAL(valueChanged(int)),
this, SLOT(rotateFunc(int)));
//缩放
scaleslider = new QSlider;
scaleslider->setOrientation(Qt::Horizontal);//水平方向
scaleslider->setMinimum(1);//最小值
scaleslider->setMaximum(10);//最大值
scaleslider->setValue(1);//初始值
connect(scaleslider, SIGNAL(valueChanged(int)),
this, SLOT(scaleFunc(int)));
//倾斜
skewslider = new QSlider;
skewslider->setOrientation(Qt::Horizontal);//水平方向
skewslider->setMinimum(-180);//最小值
skewslider->setMaximum(180);//最大值
skewslider->setValue(0);//初始值
connect(skewslider, SIGNAL(valueChanged(int)),
this, SLOT(skewFunc(int)));
//重置按钮
QPushButton *resetbutton = new QPushButton("重置");
connect(resetbutton, SIGNAL(clicked()),
this, SLOT(resetFunc()));
//布局
QVBoxLayout *controlLayout = new QVBoxLayout;
controlLayout->addWidget(rotatelabel);
controlLayout->addWidget(rotateslider);
controlLayout->addWidget(scalelabel);
controlLayout->addWidget(scaleslider);
controlLayout->addWidget(skewlabel);
controlLayout->addWidget(skewslider);
controlLayout->addWidget(resetbutton);
controlFrame->setLayout(controlLayout);
}