QT学习笔记11(图形与图片)

一、Qt的位置函数

Qt中提供了很多关于获取窗体位置及其显示区域大小的函数,如x(),y(),pos(),rect(),size(),geometry()等,统称为“位置函数”。

 应用举例:设计界面,当改变对话框的大小或移动对话框时,显示窗口坐标。

(1).h文件编写控件,注册与窗口移动和大小变化相关的函数

protected:
    void moveEvent(QMoveEvent *);
    void resizeEvent(QResizeEvent *);

(2)构造函数初始化

(3)获取窗口位置并显示

void Geometry::updateLabel()
{
  QString xStr;                      	//获得x()函数的结果并显示
  xValueLabel->setText(xStr.setNum(x()));
  QString yStr;                      	//获得y()函数的结果并显示
  yValueLabel->setText(yStr.setNum(y()));
  QString frameStr;                   //获得frameGeometry()函数的结果并显示
 QString tempStr1,tempStr2,tempStr3,tempStr4;
    frameStr = tempStr1.setNum(frameGeometry().x())+","+
         tempStr2.setNum(frameGeometry().y())+","+
         tempStr3.setNum(frameGeometry().width())+","+
        tempStr4.setNum(frameGeometry().height());
    FrmValueLabel->setText(frameStr);
    QString positionStr;            	//获得pos()函数的结果并显示
    QString tempStr11,tempStr12;
    positionStr =tempStr11.setNum(pos().x())+","+
            tempStr12.setNum(pos().y());
    posValueLabel->setText(positionStr);
    QString geoStr;               		//获得geometry()函数的结果并显示
    QString tempStr21,tempStr22,tempStr23,tempStr24;
    geoStr =tempStr21.setNum(geometry().x())+","+
         tempStr22.setNum(geometry().y())+","+
         tempStr23.setNum(geometry().width())+","+
         tempStr24.setNum(geometry().height());
    geoValueLabel->setText(geoStr);
    QString wStr,hStr;                  //获得width()、height()函数的结果并显示
    widthValueLabel->setText(wStr.setNum(width()));
    heightValueLabel->setText(hStr.setNum(height()));
    QString rectStr;                    //获得rect()函数的结果并显示
    QString tempStr31,tempStr32,tempStr33,tempStr34;
    rectStr =tempStr31.setNum(rect().x())+","+
          tempStr32.setNum(rect().y())+","+
          tempStr33.setNum(/*rect().width()*/width())+","+
          tempStr34.setNum(height()/*rect().height()*/);
    rectValueLabel->setText(rectStr);
    QString sizeStr;                    //获得size()函数的结果并显示
    QString tempStr41,tempStr42;
    sizeStr =tempStr41.setNum(size().width())+","+
          tempStr42.setNum(size().height());
    sizeValueLabel->setText(sizeStr);

}

 (4)编写事件

void Geometry::moveEvent(QMoveEvent *)
{
    updateLabel();
}

void Geometry::resizeEvent(QResizeEvent *)
{
    updateLabel();
}

显示效果:

二、基础图形的绘制

应用举例:设计界面,区分各种形状以及画笔颜色、画笔线宽、画笔风格、画笔顶帽、画笔连接点、填充模式、铺展效果、画刷颜色和画刷风格等,设计效果如下:

由两个类组成,一个用于画图的区域PaintArea类,另一个主窗口MainWidget类,此处涉及到Qt中,一个绘制界面的类如何调用另一个类。

1、建立MainWidget类用于绘制界面

2、建立PaintArea类用于绘制图形

(1)设计PaintArea类的头文件

#ifndef PAINTAREA_H
#define PAINTAREA_H

#include <QWidget>
#include <QPen>
#include <QBrush>
class PaintArea : public QWidget
{
    Q_OBJECT
public:
    enum Shape{Line,Rectangle,RoundRect,Ellipse,Polygon,Polyline,Points,Arc,Path,Text,Pixmap};
    explicit PaintArea(QWidget *parent = 0);
    void setShape(Shape);
    void setPen(QPen);
    void setBrush(QBrush);
    void setFillRule(Qt::FillRule);
    void paintEvent(QPaintEvent *);//定于绘制事件
signals:

public slots:
private:
    Shape shape;
    QPen pen;
    QBrush brush;
    Qt::FillRule fillRule;
};

#endif // PAINTAREA_H

(2)设计.cpp文件

#include "paintarea.h"
#include <QPainter>
PaintArea::PaintArea(QWidget *parent) : QWidget(parent)
{
    setPalette(QPalette(Qt::white));
    setAutoFillBackground(true);
    setMinimumSize(400,400);
}
void PaintArea::setShape(Shape s)
{
    shape = s;
    update();
}
void PaintArea::setPen(QPen p)
{
    pen = p;
    update();
}
void PaintArea::setBrush(QBrush b)
{
    brush = b;
    update();
}
void PaintArea::setFillRule(Qt::FillRule rule)
{
    fillRule =rule;
    update();      							//重画绘制区窗体
}
void PaintArea::paintEvent(QPaintEvent *)
{
    QPainter p(this);						//新建一个QPainter对象
    p.setPen(pen);							//设置QPainter对象的画笔
    p.setBrush(brush);						//设置QPainter对象的画刷
    QRect rect(50,100,300,200);				//(a)
    static const QPoint points[4]=			//(b)
    {
        QPoint(150,100),
        QPoint(300,150),
        QPoint(350,250),
        QPoint(100,300)
    };
    int startAngle =30*16;					//(c)
    int spanAngle =120*16;
    QPainterPath path;                      //新建一个QPainterPath对象为画路径做准备
    path.addRect(150,150,100,100);
    path.moveTo(100,100);
    path.cubicTo(300,100,200,200,300,300);
    path.cubicTo(100,300,200,200,100,100);
    path.setFillRule(fillRule);
    switch(shape)							//(d)
    {
        case Line:                          //直线
            p.drawLine(rect.topLeft(),rect.bottomRight());break;
        case Rectangle:                     //长方形
            p.drawRect(rect);	break;
        case RoundRect:                     //圆角方形
            p.drawRoundRect(rect); 	break;
        case Ellipse:                       //椭圆形
            p.drawEllipse(rect); 	break;
        case Polygon:                       //多边形
            p.drawPolygon(points,4); 	break;
        case Polyline:                      //多边线
            p.drawPolyline(points,4); 	break;
        case Points:                        //点
            p.drawPoints(points,4); 	break;
        case Arc:                            //弧
            p.drawArc(rect,startAngle,spanAngle);	 break;
        case Path:                           //路径
            p.drawPath(path); 	break;
        case Text:                           //文字
            p.drawText(rect,Qt::AlignCenter,tr("Hello Qt!"));break;
        case Pixmap:                         //图片
            p.drawPixmap(150,150,QPixmap("butterfly.png")); 	break;
        default: 	break;
    }
}

3、MainWidget类调用PaintArea类

(1)首先主窗口中添加PaintArea类的头文件

#include "paintarea.h"

(2)MainWidget类的头文件中实例化PaintArea类

class MainWidget : public QWidget
{
   private:
      PaintArea *paintArea;
}

(3)mainwidet.cpp文件调用PaintArea类的函数

oid MainWidget::ShowShape(int value)
{
    PaintArea::Shape shape = PaintArea::Shape(shapeComboBox->itemData(
            value,Qt::UserRole).toInt());
    paintArea->setShape(shape);
}

 

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值