欢迎小伙伴的点评✨✨,相互学习、互关必回、全天在线🍳🍳🍳
博主🧑🧑 本着开源的精神交流Qt开发的经验、将持续更新续章,为社区贡献博主自身的开源精神👩🚀
本章首先介绍几种主要位置函数及其之间的区别,以及各种与位置相关函数的使用场合;然后,通过一个简单绘图工具实例,介绍利用 QPainter 和 QPainterPath 两种方法绘制各种基础图形。
Qt 提供了很多关于获取窗体位置及显示区域大小的函数,如 x() 、 y()和 pos() 、 rect() 、 size() 、geometry()等,统称为“位置相关函数”或“位置函数”。
其中,
图一

#ifndef DIALOG_H
#define DIALOG_H
#include
#include
#include
class Dialog : public QDialog
{
Q_OBJECT
public:
Dialog(QWidget *parent = 0);
~Dialog();
void updateLabel();
private:
QLabel *xLabel;
QLabel *xValueLabel;
QLabel *yLabel;
QLabel *yValueLabel;
QLabel *FrmLabel;
QLabel *FrmValueLabel;
QLabel *posLabel;
QLabel *posValueLabel;
QLabel *geoLabel;
QLabel *geoValueLabel;
QLabel *widthLabel;
QLabel *widthValueLabel;
QLabel *heightLabel;
QLabel *heightValueLabel;
QLabel *rectLabel;
QLabel *rectValueLabel;
QLabel *sizeLabel;
QLabel *sizeValueLabel;
QGridLayout *mainLayout;
protected:
void moveEvent(QMoveEvent *);
void resizeEvent(QResizeEvent *);
};
#endif // DIALOG_H
#include "dialog.h"
Dialog::Dialog(QWidget *parent)
: QDialog(parent)
{
setWindowTitle(tr("Geometry"));
xLabel =new QLabel(tr("x():"));
xValueLabel =new QLabel;
yLabel =new QLabel (tr ("y():"));
yValueLabel =new QLabel;
FrmLabel =new QLabel(tr("Frame:"));
FrmValueLabel =new QLabel;
posLabel =new QLabel (tr ("pos():"));
posValueLabel =new QLabel;
geoLabel =new QLabel (tr("geometry():"));
geoValueLabel =new QLabel;
widthLabel =new QLabel (tr ("width():"));
widthValueLabel =new QLabel;
heightLabel =new QLabel (tr ("height():"));
heightValueLabel =new QLabel;
rectLabel =new QLabel (tr ("rect():"));
rectValueLabel =new QLabel;
sizeLabel =new QLabel (tr ("size():"));
sizeValueLabel =new QLabel;
mainLayout =new QGridLayout(this);
mainLayout->addWidget(xLabel,0,0);
mainLayout->addWidget(xValueLabel,0,1);
mainLayout->addWidget(yLabel,1,0);
mainLayout->addWidget(yValueLabel,1,1);
mainLayout->addWidget(posLabel,2,0);
mainLayout->addWidget(posValueLabel,2,1);
mainLayout->addWidget(FrmLabel,3,0);
mainLayout->addWidget(FrmValueLabel,3,1);
mainLayout->addWidget(geoLabel,4,0);
mainLayout->addWidget(geoValueLabel,4,1);
mainLayout->addWidget(widthLabel,5,0);
mainLayout->addWidget(widthValueLabel,5,1);
mainLayout->addWidget(heightLabel,6,0);
mainLayout->addWidget(heightValueLabel,6,1);
mainLayout->addWidget(rectLabel,7,0);
mainLayout->addWidget(rectValueLabel,7,1);
mainLayout->addWidget(sizeLabel,8,0);
mainLayout->addWidget(sizeValueLabel,8,1);
updateLabel ();
}
Dialog::~Dialog()
{
}
void Dialog::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 tempStrl1,tempStrl2;
positionStr =tempStrl1. setNum (pos () .x ()) +", "+
tempStrl2. 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);
}
void Dialog::moveEvent(QMoveEvent *)
//重新定义 QWidget 的 moveEventO函数,响应对话框的移动事件,使得窗体在被移动时能够同步更新各函数的显示结果
{
updateLabel();
}
void Dialog::resizeEvent(QResizeEvent *)
//重新定义 QWidget 的 resizeEventQ函数,响应对话框的大小调整事件,使得在窗体大小发生改变时,也能够同步更新各函数的显示结果
{
updateLabel();
}
#include "dialog.h"
#include
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
Dialog w;
w.show();
return a.exec();
}
图像与图片的位置相关函数会在应用程序开发中经常用到的