Qt浅谈之十一:Qt各类位置信息

一、简介

       QWidget提供了处理窗口部件的几何布局的函数,分两类:(1)包含窗口边框的处理函数,包括x(), y(), frameGeometry(), pos()和move()。(2)不包含窗口边框的处理函数,包括geometry(), width(), height(), rect(), size()和resize()。

二、运行图

(1)Qt窗口几何布局如下图1所示。

注:Linux采用X11窗口系统,它不用于Windows的一种用户界面技术。在Linux下使用QWidget的这些函数,常会出现一些令人迷惑的现象。

三、详解

1、Linux下位置信息

分析:(1)y()是25,表明Centos系统的菜单栏高度为25。(2)frameGeometry()表明整个窗口长348,宽321。(3)pos表明整个窗口的左上顶点为(0, 25)。(4)geomerty()表明窗口左边框宽2,标题栏宽为51-25=26,用户区框344,右边框宽348-344-2=2,下边框宽321-291-26=4。(5)rect()和size()都为用户中央区域的长宽,rect()左上顶点坐标始终是(0, 0)。

(注:初始化窗体时使用setGeometry()函数会导致窗体show()后在错误的位置停留短暂的一段时间,带来闪烁现象,所以使用resize()和move()函数代替)。

2、Windows下位置信息


(1)x()、y()都是0,从屏幕的最左上角开始。(2)frameGeometry()表明整个窗口长323,宽338。(3)pos表明整个窗口的左上顶点为(0, 0)。(4)geomerty()表明窗口左边框宽8,标题栏宽为30,用户区框307,右边框宽323-307-8=8,下边框宽338-300-30=8。(5)rect()和size()都为用户中央区域的长宽,rect()左上顶点坐标始终是(0, 0)。

3、代码

新建一个项目,继承QDialog即可。


(1)main.cpp

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

int main(int argc, char *argv[])
{
    QFont font("ZYSong18030",12);
    QApplication::setFont(font);
    	
    QApplication app(argc,argv);
    QTranslator translator(0);
    translator.load("geometry_zh",".");
    app.installTranslator(&translator);    
    Geometry *g = new Geometry();
    g->show();
    return app.exec();
}
(2)geometry.h

#ifndef GEOMETRY_H
#define GEOMETRY_H

#include <QtGui>

class Geometry : public QDialog
{
    Q_OBJECT
public:
    Geometry();
    
    QLabel *label1;
    QLabel *label2;
    QLabel *label3;
    QLabel *label4;
    QLabel *label5;
    QLabel *label6;
    QLabel *label7;
    QLabel *label8;
    QLabel *label9;

    QLabel *xLabel;
    QLabel *yLabel;
    QLabel *frameGeoLabel;
    QLabel *posLabel;
    QLabel *geoLabel;
    QLabel *widthLabel;
    QLabel *heightLabel;
    QLabel *rectLabel;
    QLabel *sizeLabel;
    
    void updateLabel();

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

};

#endif // GEOMETRY_H
(3)geometry.cpp
#include "geometry.h"
#include <QDebug>
#include <QString>

Geometry::Geometry()
{
    setWindowTitle(tr("Geometry"));

    label1 = new QLabel;
    label1->setText("x():"); 
    label2 = new QLabel;
    label2->setText("y():"); 
    label3 = new QLabel;
    label3->setText("frameGeometry():"); 
    label4 = new QLabel;
    label4->setText("pos():"); 
    label5 = new QLabel;
    label5->setText("geometry():"); 
    label6 = new QLabel;
    label6->setText("width():"); 
    label7 = new QLabel;
    label7->setText("height():"); 
    label8 = new QLabel;
    label8->setText("rect():"); 
    label9 = new QLabel;
    label9->setText("size():");  
    
    xLabel = new QLabel;
    yLabel = new QLabel;
    frameGeoLabel = new QLabel;
    posLabel = new QLabel;
    geoLabel = new QLabel;
    widthLabel = new QLabel;
    heightLabel = new QLabel;
    rectLabel = new QLabel;
    sizeLabel = new QLabel;  
    
    QGridLayout *layout = new QGridLayout(this);
    layout->setMargin(20);
    layout->setSpacing(10);
    int l = 0;
    int c = 1;
    layout->addWidget(label1,0,l);
    layout->addWidget(xLabel,0,c);
    layout->addWidget(label2,1,l);
    layout->addWidget(yLabel,1,c);
    layout->addWidget(label3,2,l);
    layout->addWidget(frameGeoLabel,2,c);
    layout->addWidget(label4,3,l);
    layout->addWidget(posLabel,3,c);
    layout->addWidget(label5,4,l);
    layout->addWidget(geoLabel,4,c);
    layout->addWidget(label6,5,l);
    layout->addWidget(widthLabel,5,c);
    layout->addWidget(label7,6,l);
    layout->addWidget(heightLabel,6,c);
    layout->addWidget(label8,7,l);
    layout->addWidget(rectLabel,7,c);
    layout->addWidget(label9,8,l);
    layout->addWidget(sizeLabel,8,c);
  
    updateLabel();
}

void
Geometry::updateLabel()
{
    QString temp;
    QString str_x;
    xLabel->setText(str_x.setNum(x()));
    QString str_y;
    yLabel->setText(str_y.setNum(y()));

    QString frameGeo = QString("%1, %2, %3, %4").arg(frameGeometry().x()).arg(frameGeometry().y())
                                                .arg(frameGeometry().width()).arg(frameGeometry().height());
    frameGeoLabel->setText(frameGeo);

    QString position = QString("%1, %2").arg(pos().x()).arg(pos().y());
    posLabel->setText(position);

    QString geo = QString("%1, %2, %3, %4").arg(geometry().x()).arg(geometry().y())
                                           .arg(geometry().width()).arg(geometry().height());
    geoLabel->setText(geo);

    widthLabel->setText(QString::number(width()));
    heightLabel->setText(QString::number(height()));

    QString rectStr = QString("%1, %2, %3, %4").arg(rect().x()).arg(rect().y())
            .arg(rect().width()).arg(rect().height());;
    rectLabel->setText(rectStr);

    QString sizeStr = QString("%1, %2").arg(size().width()).arg(size().height());
    sizeLabel->setText(sizeStr);
}

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

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

四、总结

(1)QMainWindow继承了QWidget,那它们的坐标有什么异同了。工具栏、锚接部分和状态栏都算为中央区域吗?

(2)QWidget的坐标系统在QPaint作图时有哪些体现了?

(3)上述问题以后总结,若各位有明白透彻的,可以评论或者联系yang.ao@i-soft.com.cn。先谢过。


  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
`setWindowFlags(Qt::Tool | Qt::WindowStaysOnTopHint | Qt::FramelessWindowHint)` 是一个 Qt 函数调用,用于将窗口设置为工具提示窗口,并且始终保持在顶部,并且窗口没有边框。这个函数可以在创建窗口时调用,也可以在运行时调用。 下面是一个使用 `setWindowFlags(Qt::Tool | Qt::WindowStaysOnTopHint | Qt::FramelessWindowHint)` 的例子。在这个例子中,我们创建了一个简单的窗口,并将其设置为工具提示窗口、始终在顶部,并且没有边框: ```cpp #include <QtWidgets> int main(int argc, char *argv[]) { QApplication app(argc, argv); QWidget window; window.setGeometry(100, 100, 200, 200); window.setWindowTitle("Tool Window"); window.show(); // Set the window to be a tool window, always on top, and frameless window.setWindowFlags(Qt::Tool | Qt::WindowStaysOnTopHint | Qt::FramelessWindowHint); return app.exec(); } ``` 在上面的例子中,我们创建了一个名为 `window` 的 `QWidget` 对象,并通过 `setGeometry` 函数设置了窗口的位置和大小。随后,我们将窗口的标题设置为 `"Tool Window"`,并将其显示出来。最后,我们调用 `setWindowFlags` 函数,并将其参数设置为 `Qt::Tool | Qt::WindowStaysOnTopHint | Qt::FramelessWindowHint`,以将窗口设置为工具提示窗口、始终在顶部,并且没有边框。 需要注意的是,如果您想取消窗口的 `Tool`、`WindowStaysOnTopHint`、`FramelessWindowHint` 标志位,可以使用 `clearMask(Qt::Tool | Qt::WindowStaysOnTopHint | Qt::FramelessWindowHint)` 函数。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

乌托邦2号

博文不易,支持的请给予小小打赏

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值