• C++QT开发——QWidget


    1. QWidget

    QWidget类是所有窗口类的父类(控件类是也属于窗口类), 并且QWidget类的父类的QObject, 也就意味着所有的窗口类对象只要指定了父对象, 都可以实现内存资源的自动回收。这里给大家介绍一下关于这个类常用的一些API函数。

     本文福利,费领取Qt开发学习资料包、技术视频,内容包括(C++语言基础,Qt编程入门,QT信号与槽机制,QT图像绘制,QT网络,QT数据库编程,QT项目实战,QT嵌入式开发,Quick模块等等)↓↓↓↓↓↓见下面↓↓文章底部点击费领取↓↓

    1. // 构造函数
    2. QWidget::QWidget(QWidget *parent = nullptr, Qt::WindowFlags f = Qt::WindowFlags());
    3. // 公共成员函数
    4. // 给当前窗口设置父对象
    5. void QWidget::setParent(QWidget *parent);
    6. void QWidget::setParent(QWidget *parent, Qt::WindowFlags f);
    7. // 获取当前窗口的父对象, 没有父对象返回 nullptr
    8. QWidget *QWidget::parentWidget() const;
    9. //------------- 窗口位置 -------------
    10. // 得到相对于当前窗口父窗口的几何信息, 边框也被计算在内
    11. QRect QWidget::frameGeometry() const;
    12. // 得到相对于当前窗口父窗口的几何信息, 不包括边框
    13. const QRect& geometry() const;
    14. // 设置当前窗口的几何信息(位置和尺寸信息), 不包括边框
    15. void setGeometry(int x, int y, int w, int h);
    16. void setGeometry(const QRect &);
    17. //此属性保存小部件的内部几何形状,不包括任何窗口框架,等于QRect(0,0, width(), height())
    18. QRect rect();
    19. //获取小控件在父控件中的位置
    20. QPoint pos() const
    21.    
    22. // 移动窗口, 重新设置窗口的位置
    23. void move(int x, int y);
    24. void move(const QPoint &);
    25. //------------- 窗口尺寸 -------------
    26. // 获取当前窗口的尺寸信息
    27. QSize size() const
    28. // 重新设置窗口的尺寸信息
    29. void resize(int w, int h);
    30. void resize(const QSize &);
    31. // 获取当前窗口的最大尺寸信息
    32. QSize maximumSize() const;
    33. // 获取当前窗口的最小尺寸信息
    34. QSize minimumSize() const;
    35. // 设置当前窗口固定的尺寸信息
    36. void QWidget::setFixedSize(const QSize &s);
    37. void QWidget::setFixedSize(int w, int h);
    38. // 设置当前窗口的最大尺寸信息
    39. void setMaximumSize(const QSize &);
    40. void setMaximumSize(int maxw, int maxh);
    41. // 设置当前窗口的最小尺寸信息
    42. void setMinimumSize(const QSize &);
    43. void setMinimumSize(int minw, int minh);
    44. // 获取当前窗口的高度    
    45. int height() const;
    46. // 获取当前窗口的最小高度
    47. int minimumHeight() const;
    48. // 获取当前窗口的最大高度
    49. int maximumHeight() const;
    50. // 给窗口设置固定的高度
    51. void QWidget::setFixedHeight(int h);
    52. // 给窗口设置最大高度
    53. void setMaximumHeight(int maxh);
    54. // 给窗口设置最小高度
    55. void setMinimumHeight(int minh);
    56. // 获取当前窗口的宽度
    57. int width() const;
    58. // 获取当前窗口的最小宽度
    59. int minimumWidth() const;
    60. // 获取当前窗口的最大宽度
    61. int maximumWidth() const;
    62. // 给窗口设置固定宽度
    63. void QWidget::setFixedWidth(int w);
    64. // 给窗口设置最大宽度
    65. void setMaximumWidth(int maxw);
    66. // 给窗口设置最小宽度
    67. void setMinimumWidth(int minw);
    68. //------------- 窗口图标 -------------
    69. // 得到当前窗口的图标
    70. QIcon windowIcon() const;
    71. // 构造图标对象, 参数为图片的路径
    72. QIcon::QIcon(const QString &fileName);
    73. // 设置当前窗口的图标
    74. void setWindowIcon(const QIcon &icon);
    75. /*--Slots--*/
    76. //------------- 窗口标题 -------------
    77. // 得到当前窗口的标题
    78. QString windowTitle() const;
    79. // 设置当前窗口的标题
    80. void setWindowTitle(const QString &);
    81. void setWindowModified(bool)
    82. // 判断窗口是否可用
    83. bool isEnabled() const;
    84. // 设置窗口是否可用, 不可用窗口无法接收和处理窗口事件
    85. void setEnabled(bool);
    86. //------------- 窗口显示 -------------
    87. // 关闭当前窗口
    88. [slot] bool QWidget::close();
    89. // 隐藏当前窗口
    90. [slot] void QWidget::hide();
    91. // 显示当前创建以及其子窗口
    92. [slot] void QWidget::show();
    93. //设置窗口是否可见
    94. virtual void setVisible(bool visible)
    95. // 全屏显示当前窗口, 只对windows有效
    96. [slot] void QWidget::showFullScreen();
    97. // 窗口最大化显示, 只对windows有效
    98. [slot] void QWidget::showMaximized();
    99. // 窗口最小化显示, 只对windows有效
    100. [slot] void QWidget::showMinimized();
    101. // 将窗口回复为最大化/最小化之前的状态, 只对windows有效
    102. [slot] void QWidget::showNormal();
    103. //------------- 信号 -------------
    104. // QWidget::setContextMenuPolicy(Qt::ContextMenuPolicy policy);
    105. // 窗口的右键菜单策略 contextMenuPolicy() 参数设置为 Qt::CustomContextMenu, 按下鼠标右键发射该信号
    106. [signal] void QWidget::customContextMenuRequested(const QPoint &pos);
    107. // 窗口图标发生变化, 发射此信号
    108. [signal] void QWidget::windowIconChanged(const QIcon &icon);
    109. // 窗口标题发生变化, 发射此信号
    110. [signal] void QWidget::windowTitleChanged(const QString &title);

    设置鼠标样式

    Qcursor

    1. //获取鼠标的全局坐标
    2. [static] QPoint pos()
    3. [static] QPoint pos(const QScreen *screen)
    4. //将鼠标移动到全局的指定坐标    
    5. [static] void setPos(int x, int y)
    6. [static] void setPos(QScreen *screen, int x, int y)
    7. [static] void setPos(const QPoint &p)
    8. [static] void setPos(QScreen *screen, const QPoint &p)
    9. //QScreen在多屏幕的时候可用    
    • 以下代码可以通过点击按钮切换并查看所有鼠标的(内置)形状
      1. QPushButton*btn = new QPushButton("切换鼠标形状",this);
      2. connect(btn,&QPushButton::clicked,this,[=]()
      3. {
      4. static int i = 0;
      5. this->setCursor(Qt::CursorShape(i));
      6. qDebug()<<"切换成功"<<Qt::CursorShape(i);
      7. i = (i+1)%25;
      8. });
      9. }

      除了内置形状之外,还可以自定义鼠标形状

    1. QPixmap* cursorPixmaps[2]={new QPixmap("://images/cursor_one.png"),
    2.                              new QPixmap("://images/cursor_two.png")};
    3. QPushButton*btn = new QPushButton("切换鼠标样式",this);
    4. connect(btn,&QPushButton::clicked,this,[=]()
    5. {
    6.    static int i = 0;
    7.    setCursor(QCursor(*cursorPixmaps[i]));
    8.    i = (i+1)%2;
    9. });

    setWhatsThis

    setToolTip用来设置提示信息,那么setWhatsThis是用来干嘛的呢?顾名思义就是用来说明这是啥玩意的

    • 先创建三个按钮
    1. QPushButton*btn1 = new QPushButton("open",this);  
    2. QPushButton*btn2 = new QPushButton("new",this);  
    3. QPushButton*btn3 = new QPushButton("look",this);  
    4. btn2->move(100,0);                                
    5. btn3->move(200,0);                                
    6.                                                  
    7. btn1->setToolTip("打开文件");                        
    8. btn1->setWhatsThis("open a new file");            
    9.                                                  
    10. btn2->setToolTip("新建文件");                        
    11. btn2->setWhatsThis("create a new file");          
    12.                                                  
    13. btn3->setToolTip("查看");                          
    14. btn3->setWhatsThis("查看其他按钮的详细信息");                
    15.                                                  
    16. connect(btn3,&QPushButton::clicked,this,[=]()    
    17. {                                                
    18.    QWhatsThis::enterWhatsThisMode();                
    19. });                                              

    运行程序后按Shift + F1会出现当前获得焦点的widget的whatsThis信息。

    调用QWhatsThis的静态函数enterWhatsThisMode进入whatsThis模式,此时当鼠标移动到设置了whatsThis的widget上光标会出现一个问号,再点击则会出现whatsThis的窗口。

    设置窗口图标

    • 修改窗口和任务栏显示的图标

    this->setWindowIcon(QIcon("://images/snowBall.png"));

    设置应用程序图标

    简单三步,搞定~

    • 1,创建一个图标格式(ico)的文件,可以将一个普通的图片转成.ico格式的图标文件
    • 2,将转换好的ico文件放到源文件所在目录,即和.pro文件同级目录
    • 3,在.pro项目文件中添加如下代码zay.ico 即图标名

    本文福利,费领取Qt开发学习资料包、技术视频,内容包括(C++语言基础,Qt编程入门,QT信号与槽机制,QT图像绘制,QT网络,QT数据库编程,QT项目实战,QT嵌入式开发,Quick模块等等)↓↓↓↓↓↓见下面↓↓文章底部点击费领取↓↓

    QWidget槽函数

    show,hide,setVisible,setHidden,close 小结

    • 0,在Qt中如果一定要自己释放对象,官方推荐使用[slot] void QObject::deleteLater()来释放对象
    • 1,[slot] void setVisible(bool visible) 设置Widget可见或不可见
    • 2,slot] void QWidget::setHidden(bool *hidden*) 1号的马甲
    • 3,[slot] void QWidget::show() 1号的马甲
    • 4,[slot] void QWidget::hide() 1号的马甲
    • 5,[slot] bool QWidget::close() 看情况调用4号或者0号(该部件是否有父部件)
    1. 呵呵,show()、hide()、setVisible()、setHidden() 这4个函数让人看得眼花缭乱。怎么办?
    2. 看看代码吧:
    3. virtual void setVisible(bool visible);
    4. inline void setHidden(bool hidden) { setVisible(!hidden); }
    5. inline void show() { setVisible(true); }
    6. inline void hide() { setVisible(false); }

    代码很清楚:这四个东西之中,只有 setVisible 是独立的,其他三个都是它的马甲! setVisible 的作用是什么呢?顾名思义,使得一个Widget可见或不可见。 要点:不可见,是Widget不在界面上显示,但不代表对象被析构!

    1. //[1]创建关闭自己的按钮
    2. QPushButton* closeBtn = new QPushButton("closeSelf",this);
    3. connect(closeBtn,&QPushButton::clicked,this,&Widget::close);
    4. //点击右上角关闭按钮会销毁窗口
    5. connect(this,&QObject::destroyed,this,[](){qDebug()<<"this destroyed";});
    6. //[2]创建子窗口
    7. QWidget* subWidget = new QWidget;
    8. subWidget->setWindowTitle("subWidget");
    9. subWidget->show();
    10. //subWidget->setAttribute(Qt::WidgetAttribute::WA_DeleteOnClose); //点击关闭按钮时销毁窗口
    11. connect(subWidget,&QWidget::destroyed,this,[=](){qDebug()<<"subWidget destroyed";});
    12. //[3]创建关闭子窗口的按钮
    13. QPushButton*closeSubWidgetBtn = new QPushButton("closeSubWidget",this);
    14. closeSubWidgetBtn->move(100,0);
    15. connect(closeSubWidgetBtn,&QPushButton::clicked,subWidget,[=](){
    16. subWidget->close();
    17. subWidget->deleteLater(); //推荐这样销毁对象
    18. qDebug()<<subWidget;
    19. });
    20. //[4]创建显示子窗口的按钮
    21. QPushButton*showSubWidgetBtn = new QPushButton("showSubWidget",this);
    22. showSubWidgetBtn->move(200,0);
    23. connect(showSubWidgetBtn,&QPushButton::clicked,subWidget,&QWidget::show);

    坐标转换

    1. QPoint mapFrom(const QWidget *parent, const QPoint &pos) const
    2. QPoint mapFromGlobal(const QPoint &pos) const
    3. QPoint mapFromParent(const QPoint &pos) const
    4. QPoint mapTo(const QWidget *parent, const QPoint &pos) const
    5. QPoint mapToGlobal(const QPoint &pos) const
    6. QPoint mapToParent(const QPoint &pos) const
    • 这几个函数都是转换相对坐标系用的. 用另一个坐标系统的坐标值, 来表达当前坐标系统中某个坐标所指向的某个点,
    • 记住: 一定要先确两个坐标系统再确定一个点
    • 相对坐标:获取自己相对于父控件的位置 QWidget::pos()
    • 绝对坐标:将当前控件的相对位置转换为屏幕绝对位置 QWidget::mapToGlobal()
    • 绝对坐标转为相对坐标:将绝对位置对应到控件的相对位置 QWidget::mapFromGlobal()

    设置窗口标志

    • 用Qt写一个窗口,如果继承QDialog,那窗口就只有关闭按钮,如果继承QWidget,那么就有关闭,最大化,最小化三个按钮,怎样才能让关闭按钮可用,而最大化和最小化按钮不可用呢?
    1. //仅仅显示关闭按钮,添加一个帮助按钮?
    2. this->setWindowFlags(Qt::WindowType::WindowCloseButtonHint | Qt::WindowContextHelpButtonHint);
    3. //从窗口标志中移除帮助按钮标志
    4. this->setWindowFlags(windowFlags() & ~Qt::WindowContextHelpButtonHint);
    5. //移除标志或单纯添加一个标志,可以用一下简单的函数 true为设置,false为移除
    6. this->setWindowFlag(Qt::WindowContextHelpButtonHint,false);
    • 更多标志详见附录一

    设置窗口状态

    • 将窗口状态设置为windowState。 窗口状态是附录二中状态的组合。
    • 如果窗口不可见(即isVisible()返回false),窗口状态将在调用show()时生效。 对于可见窗口,更改是立即的。 例如,要在全屏模式和普通模式之间切换,请使用以下代码:
     w->setWindowState(w->windowState() ^ Qt::WindowFullScreen);
    • 为了恢复和激活最小化的窗口(同时保持其最大化和/或全屏状态),使用以下方法:
    w->setWindowState((w->windowState() & ~Qt::WindowMinimized) | Qt::WindowActive);
    • 调用这个函数将隐藏小部件。 必须调用show()使小部件再次可见,在某些窗口系统中,Qt::WindowActive不是立即的,在某些情况下可能会被忽略。

    设置属性

    • setAttribute用来设置小部件的属性,testAttribute查看是否设置了某种属性。

    常用属性

    枚举值(十进制)描述
    Qt::WA_AcceptDrops78允许来自拖放操作的数据被拖放到小部件上(参见QWidget::setAcceptDrops())
    Qt::WA_AlwaysShowToolTips84为非活动窗口启用工具提示
    Qt::WA_CustomWhatsThis47表示小部件希望在“这是什么?”模式下继续正常运行。 这是由小部件的作者设置的。
    Qt::WA_DeleteOnClose55使Qt在小部件接受关闭事件时删除该小部件
    Qt::WA_MouseTracking2指示小部件启用了鼠标跟踪。 参见QWidget:: mouseTracking
    Qt::WA_TranslucentBackground120指示小部件应该有一个半透明的背景,也就是说,小部件的任何非透明区域都将是半透明的,因为小部件将有一个alpha通道。 设置此标志将导致设置WA_NoSystemBackground。 在Windows上,小部件还需要设置Qt:: framesswindowhint窗口标志。 该标志由小部件的作者设置或清除。

    发布程序

    Qt 官方开发环境使用的动态链接库方式,在发布生成的exe程序时,需要复制一大堆 dll,如果自己去复制dll,很可能丢三落四,导致exe在别的电脑里无法正常运行。因此 Qt 官方开发环境里自带了一个工具:windeployqt.exe(这个文件在Qt安装目录的bin文件下可以找到)

    不同的编译器和版本需要使用不同的windeployqt版本打包

    以官方 Qt 5.14.2+MinGW32 开发环境为例:

    • 1,通过Qt命令行运行windeployqt工具,开始菜单->Qt 5.14.2->5.4->MinGW 4.9 (32-bit)->Qt 5.14.2 (MinGW 7.3.0 32-bit)

    • 把需要打包的Qt可执行程序拷贝到一个单独的文件夹里面,然后再把命令行工作目录切换到该文件夹

    • 最后执行命令windeployqt maye.exe

    2. 资源文件 .qrc

    需要我们给窗口设置图标

    1. // 创建图标对象
    2. QIcon::QIcon(const QString &fileName)
    3. // QWidget类的 公共成员函数
    4. void setWindowIcon(const QIcon &icon)
    5. // 给窗口设置图标
    6. // 弊端: 发布的exe 必须要加载 d:\\pic\\1.ico 如果对应的目录中么有图片, 图标就无法被加载
    7. // 发布exe 需要额外发布图片, 将其部署到某个目录中
    8. setWindowIcon(QIcon("d:\\pic\\1.ico"));

    使用资源文件解决上述的弊端:

    优势:

    1. 将图片资源放到资源文件

    2. 当程序编译的时候, 资源文件中的图片会被转换为二进制, 打包到exe中

    3. 直接发布exe就可以, 不需要额外提供图片资源了

    资源文件的创建

    • 资源文件的使用

      • 打开资源文件

      • 添加前缀

      • 添加文件

        • 弹出以文件选择对话框, 选择资源文件

          • 资源文件放到什么地方?

            • 放到和 项目文件 .pro 同一级目录或者更深的目录中

            • 错误的做法: 将资源文件放到 .pro文件的上级目录, 这样资源文件无法被加载到

        • 资源文件中添加的图片资源

      • 如何在程序中使用资源文件中的图片

    附录一

    • 此枚举类型用于为小部件指定各种窗口系统属性。 它们相当不寻常,但在少数情况下是必要的。 其中一些标志取决于底层窗口管理器是否支持它们。

    枚举值(十六进制)描述
    Qt::Widget0x00000000这是QWidget的默认类型。 这种类型的小部件如果有父部件,则为子部件,如果没有父部件,则为独立窗口。
    Qt::Window0x00000001指示小部件是一个窗口,通常带有窗口系统框架和标题栏,而不管小部件是否有父窗口。
    Qt::Dialog0x00000002| Window指示小部件是一个窗口,应该装饰为一个对话框(即,通常在标题栏中没有最大化或最小化按钮)。
    Qt::Sheet0x00000004| Window指示窗口是macOS上的工作表。 由于使用工作表意味着窗口模式,推荐的方法是使用QWidget::setWindowModality(),或QDialog::open()
    Qt::DrawerSheet | Dialog指示小部件是macOS上的一个抽屉
    Qt::Popup0x00000008| Window指示小部件是弹出式顶级窗口,即它是模态窗口,但具有适合于弹出式菜单的窗口系统框架。
    Qt::ToolPopup | Dialog指示小部件是工具窗口。 工具窗口通常是一个小窗口,比通常的标题栏和装饰更小,通常用于工具按钮集合
    Qt::ToolTipPopup | Sheet指示小部件是一个工具提示。 这在内部用于实现工具提示
    Qt::SplashScreenToolTip | Dialog表示该窗口为启动画面。 这是QSplashScreen的默认类型
    Qt::Desktop0x00000010| Window指示此小部件是桌面。 这是QDesktopWidget(此类已经过时)的类型
    Qt::SubWindow0x00000012指示此小部件是子窗口,例如QMdiSubWindow小部件
    Qt::ForeignWindow0x00000020| Window表示此窗口对象是一个句柄,表示由另一个进程或手动使用本机代码创建的本机平台窗口。
    Qt::CoverWindow0x00000040| Window指示该窗口表示覆盖窗口,该窗口在某些平台上最小化应用程序时显示。
    • 窗口提示可以有多个(不一定会生效,看平台是否支持)

    枚举值(十六进制)描述
    Qt::FramelessWindowHint0x00000800产生一个无边框的窗口。 用户不能通过窗口系统移动或调整无边框窗口的大小
    Qt::NoDropShadowWindowHint0x40000000去掉窗口阴影
    Qt::CustomizeWindowHint0x02000000关闭默认的窗口标题提示
    Qt::WindowTitleHint0x00001000给窗口一个标题栏
    Qt::WindowSystemMenuHint0x00002000添加一个窗口系统菜单,可能还有一个关闭按钮(例如在Mac上)。 如果你需要隐藏或显示关闭按钮,使用WindowCloseButtonHint更便于移植。
    Qt::WindowMinimizeButtonHint0x00004000添加一个最小化按钮
    Qt::WindowMaximizeButtonHint0x00008000添加一个最大化按钮
    Qt::WindowMinMaxButtonsHintWindowMinimizeButtonHint |WindowMaximizeButtonHint添加最小化和最大化按钮
    Qt::WindowCloseButtonHint0x08000000添加一个关闭按钮
    Qt::WindowContextHelpButtonHint0x00010000向对话框添加上下文帮助按钮
    Qt::WindowStaysOnTopHint0x00040000通知窗口系统该窗口应该位于所有其他窗口的顶部
    Qt::WindowStaysOnBottomHint0x04000000通知窗口系统该窗口应位于所有其他窗口的底部

    附录二

    • 窗口状态 Qt::WindowState

    枚举描述
    Qt::WindowNoState0x00000000窗口没有状态设置(正常状态)
    Qt::WindowMinimized0x00000001窗口被最小化(即图标化)
    Qt::WindowMaximized0x00000002窗户周围有一个框架,使其最大化
    Qt::WindowFullScreen0x00000004窗口填充了整个屏幕,周围没有任何边框
    Qt::WindowActive0x00000008该窗口是活动窗口,即它有键盘焦点

    本文福利,费领取Qt开发学习资料包、技术视频,内容包括(C++语言基础,Qt编程入门,QT信号与槽机制,QT图像绘制,QT网络,QT数据库编程,QT项目实战,QT嵌入式开发,Quick模块等等)↓↓↓↓↓↓见下面↓↓文章底部点击费领取↓↓

  • 相关阅读:
    pytorch 数据载入
    Milvus向量数据库:处理和分析大规模向量数据
    【数字IC设计】DC自动添加门控时钟
    了解MQ和安装使用RabbitMQ
    HarmonyOS应用开发JSAPI-js拨打电话call
    STM32控制舵机精准角度
    Windows开机密码破解
    Sentry 是一个开源的错误监控和日志聚合平台-- 通过docker-compose 安装Sentry
    25-全局函数和变量
    Jaca定时任务-01-进程级别的Timer,ScheduledExecutorService,springtask
  • 原文地址:https://blog.csdn.net/m0_60259116/article/details/127810617