一、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);
}