Qt5位置相关函数

17 篇文章 0 订阅

一、如何表示窗体的位置,采用坐标体系

先来张图,说明Qt中如何获得窗体的坐标信息。

上图中,有获取窗体信息的函数:

x()、y()、pos()获得整个窗体左上角的位置;

geometry()获得窗体内中央区域的左上角顶点坐标和长、宽;

frameGeometry()获得整个窗体的左上角顶点位置和长、宽。

二、来个例子,展示上述API的作用

来张图,显示结果~

Source Code文件:

Geometry.pro

TEMPLATE = app

# The following define makes your compiler emit warnings if you use
# any feature of Qt which has been marked as deprecated (the exact warnings
# depend on your compiler). Please consult the documentation of the
# deprecated API in order to know how to port your code away from it.
DEFINES += QT_DEPRECATED_WARNINGS

# You can also make your code fail to compile if you use deprecated APIs.
# In order to do so, uncomment the following line.
# You can also select to disable deprecated APIs only up to a certain version of Qt.
#DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000    # disables all the APIs deprecated before Qt 6.0.0

CONFIG += c++11

SOURCES += \
        main.cpp \
        geometry.cpp

HEADERS += \
        geometry.h

# Default rules for deployment.
qnx: target.path = /tmp/$${TARGET}/bin
else: unix:!android: target.path = /opt/$${TARGET}/bin
!isEmpty(target.path): INSTALLS += target

geometry.h

#ifndef GEOMETRY_H
#define GEOMETRY_H

#include <QDialog>

class QLabel;
class QGridLayout;

class Geometry : public QDialog
{
    Q_OBJECT

public:
    Geometry(QWidget *parent = nullptr);
    ~Geometry();

    void updateLabel();

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

private:
    using QLabelPtr = QLabel *;

    QLabelPtr xLabel, xValueLabel;
    QLabelPtr yLabel, yValueLabel;
    QLabelPtr frmLabel, frmValueLabel;
    QLabelPtr posLabel, posValueLabel;
    QLabelPtr geoLabel, geoValueLabel;
    QLabelPtr widthLabel, widthValueLabel;
    QLabelPtr heightLabel, heightValueLabel;
    QLabelPtr rectLabel, rectValueLable;
    QLabelPtr sizeLabel, sizeValueLabel;

    QGridLayout *mainLayout;
};

#endif // GEOMETRY_H

geometry.cpp

#include "geometry.h"
#include <QLabel>
#include <QGridLayout>

Geometry::Geometry(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(): "));
    rectValueLable = 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(frmLabel, 2, 0);
    mainLayout->addWidget(frmValueLabel, 2, 1);
    mainLayout->addWidget(posLabel, 3, 0);
    mainLayout->addWidget(posValueLabel, 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(rectValueLable, 7, 1);
    mainLayout->addWidget(sizeLabel, 8, 0);
    mainLayout->addWidget(sizeValueLabel, 8, 1);

    updateLabel();
}

void Geometry::moveEvent(QMoveEvent*)  //响应对话框的移动事件
{
    updateLabel();
}

void Geometry::resizeEvent(QResizeEvent*)  //响应对话框的大小调整事件
{
    updateLabel();
}

void Geometry::updateLabel()
{
    xValueLabel->setText(QString().setNum(x()));
    yValueLabel->setText(QString().setNum(y()));

    QString frameStr = QString().setNum(frameGeometry().x()) + ", "
                     + QString().setNum(frameGeometry().y()) + ", "
                     + QString().setNum(frameGeometry().width()) + ", "
                     + QString().setNum(frameGeometry().height());
    frmValueLabel->setText(frameStr);

    QString posStr = QString().setNum(pos().x()) + ", "
                   + QString().setNum(pos().y());
    posValueLabel->setText(posStr);

    QString geoStr = QString().setNum(geometry().x()) + ", "
                   + QString().setNum(geometry().y()) + ", "
                   + QString().setNum(geometry().width()) + ", "
                   + QString().setNum(geometry().height());
    geoValueLabel->setText(geoStr);

    widthValueLabel->setText(QString().setNum(width()));
    heightValueLabel->setText(QString().setNum(height()));

    QString rectStr = QString().setNum(rect().x()) + ", "
                    + QString().setNum(rect().y()) + ", "
                    + QString().setNum(rect().width()) + ", "
                    + QString().setNum(rect().height());
    rectValueLable->setText(rectStr);

    QString sizeStr = QString().setNum(size().width()) + ", "
                    + QString().setNum(size().height());
    sizeValueLabel->setText(sizeStr);
}

Geometry::~Geometry()
{
    if(xLabel) { delete xLabel; xLabel = nullptr; }
    if(xValueLabel) { delete xValueLabel; xValueLabel = nullptr; }
    if(yLabel) { delete yLabel; yLabel = nullptr; }
    if(yValueLabel) { delete yValueLabel; yValueLabel = nullptr; }

    if(frmLabel) { delete frmLabel; frmLabel = nullptr; }
    if(frmValueLabel) { delete frmValueLabel; frmValueLabel = nullptr; }
    if(posLabel) { delete posLabel; posLabel = nullptr; }
    if(posValueLabel) { delete posValueLabel; posValueLabel = nullptr; }

    if(geoLabel) { delete geoLabel; geoLabel = nullptr; }
    if(geoValueLabel) { delete geoValueLabel; geoValueLabel = nullptr; }
    if(widthLabel) { delete widthLabel; widthLabel = nullptr; }
    if(widthValueLabel) { delete widthValueLabel; widthValueLabel = nullptr; }
    if(heightLabel) { delete heightLabel; heightLabel = nullptr; }
    if(heightValueLabel) { delete heightValueLabel; heightValueLabel = nullptr; }
    if(rectLabel) { delete rectLabel; rectLabel = nullptr; }
    if(rectValueLable) { delete rectValueLable; rectValueLable = nullptr; }
    if(sizeLabel) { delete sizeLabel; sizeLabel = nullptr; }
    if(sizeValueLabel) { delete sizeValueLabel; sizeValueLabel = nullptr; }

    if (mainLayout) { delete mainLayout; mainLayout = nullptr; }
}

main.cpp

#include "geometry.h"
#include <QApplication>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    Geometry w;
    w.show();

    return a.exec();
}

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值