(10)QWidget的使用(one)

简介: 文章介绍了QWidget的使用,包括如何获取和设置QWidget的大小和位置、设置窗口固定大小、限定窗口大小、坐标系统转换、内容边距、鼠标指针形状以及自定义光标的使用。

QWidget类是所有可视控件的基类,控件是用户界面的最小元素,用于接受各种事件(如:鼠标、键盘等)并且绘制出来给用户观看。每个控件都是矩形的,他们按照Z轴顺序排列。如果控件没有父控件,则称之为窗口,窗口会被一个框架包裹(包含标题栏,边框等),可以通过某些函数来修改边框属性。

QWidget的大小和位置

获取QWidget的大小和位置

#include <QApplication>
#include <QWidget>
#include <QDebug>

int main(int argc, char* argv[]) 
{
    QApplication a(argc, argv);

    QWidget w;        //    创建窗口
    w.show();        //    显示窗口

    //获取窗口大小与位置
    qInfo() << w.pos() << w.x() << w.y();
    qInfo() << w.size() << w.width() << w.height();
    //获取窗口几何
    qInfo() << w.geometry() << w.frameGeometry();    //  不带边框与带边框
    qInfo() << w.frameSize();                        //  带边框的大小
    qInfo() << w.rect();                            //  内部矩形(客户区)大小

    return a.exec();
}

第一行输出指的是窗口的全局坐标

第二行输出指的是客户区的大小(不包括边框)

第三行输出的是窗口客户区的全局坐标和大小(前者不带边框,后者带边框)

第四行输出的是带边框的窗口的大小

第五行输出的是窗口客户区相对于窗口的坐标以及客户区大小(不带边框)

设置QWidget的大小和位置

//移动窗口的位置(包括边框)
void move(const QPoint &)
void move(int x, int y)

//设置窗口的大小(不包括边框)
void resize(int w, int h)
void resize(const QSize &)

//设置窗口的大小和位置 (不包括边框,以客户区坐标为准)   
void setGeometry(const QRect &)
void setGeometry(int x, int y, int w, int h)

设置窗口固定大小

//不包括边框,设置的是客户区大小且不可拖动缩放窗口大小
void setFixedSize(const QSize &s)
void setFixedSize(int w, int h)

限定窗口的大小

//限定窗口的最大大小(不包括边框)
void setMaximumWidth(int maxw) 
void setMaximumHeight(int maxh)
void setMaximumSize(const QSize &)
void setMaximumSize(int maxw, int maxh)

//限定窗口的最小大小(不包括边框)
void setMinimumWidth(int minw)
void setMinimumHeight(int minh)
void setMinimumSize(const QSize &)
void setMinimumSize(int minw, int minh)

坐标系统转换

QPoint mapFrom(const QWidget *parent, const QPoint &pos) const
QPoint mapFromGlobal(const QPoint &pos) const
QPoint mapFromParent(const QPoint &pos) const

QPoint mapTo(const QWidget *parent, const QPoint &pos) const
QPoint mapToGlobal(const QPoint &pos) const
QPoint mapToParent(const QPoint &pos) const
  • 这几个函数都是转换相对坐标系用的. 用另一个坐标系统的坐标值, 来表达当前坐标系统中某个坐标所指向的某个点,

  • 相对坐标:获取自己相对于父控件的位置 QWidget::pos()

  • 绝对坐标:将当前控件的相对位置转换为屏幕绝对位置 QWidget::mapToGlobal()

  • 绝对坐标转为相对坐标:将屏幕绝对位置对应到控件的相对位置 QWidget::mapFromGlobal()

#include <QApplication>
#include <QWidget>
#include <QDebug>

int main(int argc, char* argv[]) 
{
    QApplication a(argc, argv);

    QWidget w;                                            //    创建窗口
    w.resize(640, 480);

    auto w1 = new QWidget(&w);
    w1->setGeometry(100, 100, 100, 100);
    w1->setStyleSheet("background-color:red");            //    设置w1背景色为red

    auto w2 = new QWidget(w1);
    w2->setGeometry(20, 20, 60, 60);
    w2->setStyleSheet("background-color:deepskyblue");    

    w.show();                                            //    显示窗口

    //1. 求w1的50,50位置在父控件上的坐标
    qInfo() << w1->mapToParent(QPoint(50, 50));            //    150,150
    //2. 求w的120,120在子控件w1上面的坐标
    qInfo() << w1->mapFromParent(QPoint(120, 120));        //    20,20

    //3. 求w2的0,0位置在w上的坐标
    qInfo() << w2->mapTo(&w, QPoint(0, 0));                // 120,120
    //4. 求w上的130,130在w2上的坐标
    qInfo() << w2->mapFrom(&w, QPoint(130, 130));        // 10,10

    //5. 求全局坐标500,286在w上的坐标
    qInfo() << w.mapFromGlobal(QPoint(500, 286));        // 100,100
    //6. 求w的0,0位置的全局坐标
    qInfo() << w.mapToGlobal(QPoint(0, 0));                // 400,186

    return a.exec();
}

内容边距

设置小部件内容周围的空白,使其具有左、上、右和下的大小。边距被布局系统使用,并且可以被子类用来指定要绘制的区域。

int main(int argc, char* argv[]) 
{
    QApplication a(argc, argv);

    QWidget w;                                            //    创建窗口
    w.resize(640, 480);

    //原来的效果
    auto label = new QLabel("人狠话不多", &w);
    label->resize(200, 200);
    label->setStyleSheet("background-color:green");

    //设置内容边距后的效果
    auto label2 = new QLabel("人狠话不多", &w);
    label2->move(label->x() + label->width(), 0);
    label2->resize(200, 200);
    label2->setStyleSheet("background-color:deepskyblue");
    label2->setContentsMargins(120, 150, 0, 0);

    w.show();                                            //    显示窗口

    qInfo() << label2->contentsRect()                    //    去掉外边距的内容矩形
        << label2->contentsMargins();                    //    内容边距

    return a.exec();
}

鼠标指针

鼠标指针的形状

如果要全局设置鼠标光标样式,可以使用QGuiApplication::setOverrideCursor(), 设置鼠标指针的形状需要使用QCursor类,通过像素图或枚举指定鼠标光标形状。

QCursor cursor() const
void setCursor(const QCursor &)
void unsetCursor()

Qt中自带的鼠标指针形状在枚举Qt::CursorShape中

直接使用setCursor()函数设置即可

int main(int argc, char* argv[]) 
{
    QApplication a(argc, argv);

    QWidget w;                                            //    创建窗口
    w.resize(640, 480);

    w.setCursor(QCursor(Qt::PointingHandCursor));        //    设置光标样式

    w.show();                                            //    显示窗口

    return a.exec();
}

点击按钮切换光标样式的案例

int main(int argc, char* argv[]) 
{
    QApplication a(argc, argv);

    QWidget w;                                            //    创建窗口
    w.resize(640, 480);

    auto btn = new QPushButton("切换光标样式", &w);

    QObject::connect(btn, &QPushButton::clicked, [&]()
        {
            static int i = 0;
            w.setCursor(QCursor(Qt::CursorShape(i)));
            i = (i + 1) % 22;
        });

    w.show();                                            //    显示窗口

    return a.exec();
}

自定义光标的使用

 QCursor(const QPixmap &pixmap, int hotX = -1, int hotY = -1)
 QCursor(const QBitmap &bitmap, const QBitmap &mask, int hotX = -1, int hotY = -1)
 QCursor(Qt::CursorShape shape)
int main(int argc, char* argv[]) 
{
    QApplication a(argc, argv);

    QWidget w;                                            //    创建窗口
    w.resize(640, 480);

    auto btn = new QPushButton("Button", &w);

    QPixmap map = QPixmap("cursor.png");
    map = map.scaled(30, 30);           //  将图片缩放到(30,30)大小
    w.setCursor(QCursor(map, 0, 0));    //    0,0表示将焦点放到图片(0,0)的位置

    w.show();                                            //    显示窗口

    return a.exec();
}

可能会出现的error:

QPixmap::scaled: Pixmap is a null pixmap
QCursor: Cannot create bitmap cursor; invalid bitmap(s)

这是因为图片没有在指定路径下找到,将图片放到项目的Debug目录下与exe文件同级目录即可。

获取和设置光标的坐标

[static] QPoint pos()
[static] QPoint pos(const QScreen *screen)

[static] void setPos(int x, int y)
[static] void setPos(QScreen *screen, int x, int y)
[static] void setPos(const QPoint &p)
[static] void setPos(QScreen *screen, const QPoint &p)
qInfo() << QCursor::pos();    //  获取光标的全局坐标
QCursor::setPos(0, 0);        //    将光标设置到全局(0,0)的位置
相关文章
WK
|
9天前
|
数据安全/隐私保护
QTextEdit
QTextEdit是Qt框架中的高级文本编辑控件,支持富文本格式、图像、列表和表格的插入,优化处理大型文档,支持HTML和Markdown格式,提供段落和字符级别的格式控制,以及占位文本提示。常用成员函数包括设置和获取文本内容、文本格式设置等。QTextEdit还提供了多种信号和丰富的交互功能,适用于需要处理复杂文本的应用场景。
WK
15 1
|
存储 C++
14 QT - QMainWindow
14 QT - QMainWindow
47 0
|
前端开发 数据可视化 C++
Qt 之 QWidget QLabel
Qt 之 QWidget QLabel
106 0
|
数据安全/隐私保护
22 QT - QLineEdit
22 QT - QLineEdit
55 0
WK
|
10天前
QMainWindow
QMainWindow 是 Qt 中用于创建主窗口应用程序的类,支持菜单栏、工具栏、中央部件、停靠部件和状态栏等组件。菜单栏用于添加菜单项和子菜单;工具栏显示常用菜单项,可插入其他窗口部件;中央部件位于主窗口中心,实现主要功能;停靠部件可停靠在窗口四周,用于设置功能部件;状态栏显示程序状态信息。QMainWindow 提供了多种函数和高级用法,如自定义工具栏、多文档接口和快捷键设置。
WK
21 5
WK
|
9天前
|
C++ 开发者
QDialog
QDialog是Qt框架中的对话框基类,支持模态和非模态两种模式。它提供了丰富的函数,如exec()、show()、accept()和reject(),用于控制对话框的行为。QDialog可以包含多种控件,用于收集用户输入或显示信息。此外,Qt还提供了一些常用的标准化对话框,如QColorDialog、QFileDialog、QFontDialog、QInputDialog和QMessageBox,方便开发者快速实现特定功能。
WK
16 2
WK
|
11天前
|
数据可视化 开发者 容器
QWidget类
QWidget 是 Qt 框架中的基础类,用于创建用户界面的可视化组件。它是所有 UI 组件的基类,提供绘制、布局、事件处理、样式设置和部件通信等功能。常见子类包括 QMainWindow、QDialog、QPushButton 等,支持灵活的窗口管理和丰富的用户交互。
WK
11 3
|
1月前
|
iOS开发 MacOS
(11)QWidget的使用(two)
本文介绍了如何在Qt框架中使用QWidget类来设置和获取窗口的图标和标题,以及如何进行窗口状态和不透明度的设置。
15 3
|
3月前
Qt绘图之QWidget
Qt绘图之QWidget
80 1
|
5月前
Qt之QMainWindow
Qt之QMainWindow