0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

QWidget类相关操作是什么

汽车电子技术 来源:C语言Plus 作者:Maye426 2023-02-27 14:53 次阅读

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

// 构造函数
 QWidget::QWidget(QWidget *parent = nullptr, Qt::WindowFlags f = Qt::WindowFlags());

 // 公共成员函数
 // 给当前窗口设置父对象
 void QWidget::setParent(QWidget *parent);
 void QWidget::setParent(QWidget *parent, Qt::WindowFlags f);
 // 获取当前窗口的父对象, 没有父对象返回 nullptr
 QWidget *QWidget::parentWidget() const;

 //------------- 窗口位置 -------------
 // 得到相对于当前窗口父窗口的几何信息, 边框也被计算在内
 QRect QWidget::frameGeometry() const;
 // 得到相对于当前窗口父窗口的几何信息, 不包括边框
 const QRect& geometry() const;
 // 设置当前窗口的几何信息(位置和尺寸信息), 不包括边框
 void setGeometry(int x, int y, int w, int h);
 void setGeometry(const QRect &);
 //此属性保存小部件的内部几何形状,不包括任何窗口框架,等于QRect(0,0, width(), height())
 QRect rect();
 //获取小控件在父控件中的位置
 QPoint pos() const

 // 移动窗口, 重新设置窗口的位置
 void move(int x, int y);
 void move(const QPoint &);

 //------------- 窗口尺寸 -------------
 // 获取当前窗口的尺寸信息
 QSize size() const
 // 重新设置窗口的尺寸信息
 void resize(int w, int h);
 void resize(const QSize &);
 // 获取当前窗口的最大尺寸信息
 QSize maximumSize() const;
 // 获取当前窗口的最小尺寸信息
 QSize minimumSize() const;
 // 设置当前窗口固定的尺寸信息
 void QWidget::setFixedSize(const QSize &s);
 void QWidget::setFixedSize(int w, int h);
 // 设置当前窗口的最大尺寸信息
 void setMaximumSize(const QSize &);
 void setMaximumSize(int maxw, int maxh);
 // 设置当前窗口的最小尺寸信息
 void setMinimumSize(const QSize &);
 void setMinimumSize(int minw, int minh);


 // 获取当前窗口的高度    
 int height() const;
 // 获取当前窗口的最小高度
 int minimumHeight() const;
 // 获取当前窗口的最大高度
 int maximumHeight() const;
 // 给窗口设置固定的高度
 void QWidget::setFixedHeight(int h);
 // 给窗口设置最大高度
 void setMaximumHeight(int maxh);
 // 给窗口设置最小高度
 void setMinimumHeight(int minh);

 // 获取当前窗口的宽度
 int width() const;
 // 获取当前窗口的最小宽度
 int minimumWidth() const;
 // 获取当前窗口的最大宽度
 int maximumWidth() const;
 // 给窗口设置固定宽度
 void QWidget::setFixedWidth(int w);
 // 给窗口设置最大宽度
 void setMaximumWidth(int maxw);
 // 给窗口设置最小宽度
 void setMinimumWidth(int minw);


 //------------- 窗口图标 -------------
 // 得到当前窗口的图标
 QIcon windowIcon() const;
 // 构造图标对象, 参数为图片的路径
 QIcon::QIcon(const QString &fileName);
 // 设置当前窗口的图标
 void setWindowIcon(const QIcon &icon);

 /*--Slots--*/
 //------------- 窗口标题 -------------
 // 得到当前窗口的标题
 QString windowTitle() const;
 // 设置当前窗口的标题
 void setWindowTitle(const QString &);

 void setWindowModified(bool)


 // 判断窗口是否可用
 bool isEnabled() const;
 // 设置窗口是否可用, 不可用窗口无法接收和处理窗口事件
 void setEnabled(bool);

 //------------- 窗口显示 -------------
 // 关闭当前窗口
 [slot] bool QWidget::close();
 // 隐藏当前窗口
 [slot] void QWidget::hide();
 // 显示当前创建以及其子窗口
 [slot] void QWidget::show();
 //设置窗口是否可见
 virtual void setVisible(bool visible)

 // 全屏显示当前窗口, 只对windows有效
 [slot] void QWidget::showFullScreen();
 // 窗口最大化显示, 只对windows有效
 [slot] void QWidget::showMaximized();
 // 窗口最小化显示, 只对windows有效
 [slot] void QWidget::showMinimized();
 // 将窗口回复为最大化/最小化之前的状态, 只对windows有效
 [slot] void QWidget::showNormal();


 //------------- 信号 -------------
 // QWidget::setContextMenuPolicy(Qt::ContextMenuPolicy policy);
 // 窗口的右键菜单策略 contextMenuPolicy() 参数设置为 Qt::CustomContextMenu, 按下鼠标右键发射该信号
 [signal] void QWidget::customContextMenuRequested(const QPoint &pos);
 // 窗口图标发生变化, 发射此信号
 [signal] void QWidget::windowIconChanged(const QIcon &icon);
 // 窗口标题发生变化, 发射此信号
 [signal] void QWidget::windowTitleChanged(const QString &title);

设置鼠标样式

Qcursor

//获取鼠标的全局坐标
 [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)
 //QScreen在多屏幕的时候可用
  • 以下代码可以通过点击按钮切换并查看所有鼠标的(内置)形状
  • QPushButton*btn = new QPushButton("切换鼠标形状",this);
     connect(btn,&QPushButton::clicked,this,[=]()
     {
         static int i = 0;
         this->setCursor(Qt::CursorShape(i));
         qDebug()<<"切换成功"<
    
  • 除了内置形状之外,还可以自定义鼠标形状
QPixmap* cursorPixmaps[2]={new QPixmap("://images/cursor_one.png"),
                               new QPixmap("://images/cursor_two.png")};
 QPushButton*btn = new QPushButton("切换鼠标样式",this);
 connect(btn,&QPushButton::clicked,this,[=]()
 {
     static int i = 0;
     setCursor(QCursor(*cursorPixmaps[i]));
     i = (i+1)%2;
 });

setWhatsThis

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

  • 先创建三个按钮
QPushButton*btn1 = new QPushButton("open",this);  
 QPushButton*btn2 = new QPushButton("new",this);  
 QPushButton*btn3 = new QPushButton("look",this);  
 btn2->move(100,0);                                
 btn3->move(200,0);                                

 btn1->setToolTip("打开文件");                        
 btn1->setWhatsThis("open a new file");            

 btn2->setToolTip("新建文件");                        
 btn2->setWhatsThis("create a new file");          

 btn3->setToolTip("查看");                          
 btn3->setWhatsThis("查看其他按钮的详细信息");                

 connect(btn3,&QPushButton::clicked,this,[=]()    
 {                                                
     QWhatsThis::enterWhatsThisMode();                
 });
  • 运行程序后按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 即图标名

RC_ICONS += zay.ico

发布程序

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

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号(该部件是否有父部件)
呵呵,show()、hide()、setVisible()、setHidden() 这4个函数让人看得眼花缭乱。怎么办?
 看看代码吧:
 virtual void setVisible(bool visible);
 inline void setHidden(bool hidden) { setVisible(!hidden); }
 inline void show() { setVisible(true); }
 inline void hide() { setVisible(false); }

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

//[1]创建关闭自己的按钮
 QPushButton* closeBtn = new QPushButton("closeSelf",this);
 connect(closeBtn,&QPushButton::clicked,this,&Widget::close);
 //点击右上角关闭按钮会销毁窗口
 connect(this,&QObject::destroyed,this,[](){qDebug()<<"this destroyed";});

 //[2]创建子窗口
 QWidget* subWidget = new QWidget;
 subWidget->setWindowTitle("subWidget");
 subWidget->show();
 //subWidget->setAttribute(Qt::WidgetAttribute::WA_DeleteOnClose);   //点击关闭按钮时销毁窗口        
 connect(subWidget,&QWidget::destroyed,this,[=](){qDebug()<<"subWidget destroyed";});
 //[3]创建关闭子窗口的按钮
 QPushButton*closeSubWidgetBtn = new QPushButton("closeSubWidget",this);
 closeSubWidgetBtn->move(100,0);
 connect(closeSubWidgetBtn,&QPushButton::clicked,subWidget,[=](){
     subWidget->close();
     subWidget->deleteLater();   //推荐这样销毁对象
     qDebug()<

坐标转换

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()

设置窗口标志

  • 用Qt写一个窗口,如果继承QDialog,那窗口就只有关闭按钮,如果继承QWidget,那么就有关闭,最大化,最小化三个按钮,怎样才能让关闭按钮可用,而最大化和最小化按钮不可用呢?
//仅仅显示关闭按钮,添加一个帮助按钮?
 this->setWindowFlags(Qt::WindowType::WindowCloseButtonHint | Qt::WindowContextHelpButtonHint);
 //从窗口标志中移除帮助按钮标志
 this->setWindowFlags(windowFlags() & ~Qt::WindowContextHelpButtonHint);
 //移除标志或单纯添加一个标志,可以用一下简单的函数true为设置,false为移除
 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_AcceptDrops 78 允许来自拖放操作的数据被拖放到小部件上(参见QWidget::setAcceptDrops())
Qt::WA_AlwaysShowToolTips 84 为非活动窗口启用工具提示
Qt::WA_CustomWhatsThis 47 表示小部件希望在“这是什么?”模式下继续正常运行。这是由小部件的作者设置的。
Qt::WA_DeleteOnClose 55 使Qt在小部件接受关闭事件时删除该小部件
Qt::WA_MouseTracking 2 指示小部件启用了鼠标跟踪。参见QWidget:: mouseTracking
Qt::WA_TranslucentBackground 120 指示小部件应该有一个半透明的背景,也就是说,小部件的任何非透明区域都将是半透明的,因为小部件将有一个alpha通道。设置此标志将导致设置WA_NoSystemBackground。在Windows上,小部件还需要设置Qt:: framesswindowhint窗口标志。该标志由小部件的作者设置或清除。

附录一

  • 此枚举类型用于为小部件指定各种窗口系统属性。它们相当不寻常,但在少数情况下是必要的。其中一些标志取决于底层窗口管理器是否支持它们。
枚举 值(十六进制) 描述
Qt::Widget 0x00000000 这是QWidget的默认类型。这种类型的小部件如果有父部件,则为子部件,如果没有父部件,则为独立窗口。
Qt::Window 0x00000001 指示小部件是一个窗口,通常带有窗口系统框架和标题栏,而不管小部件是否有父窗口。
Qt::Dialog 0x00000002 Window
Qt::Sheet 0x00000004 Window
Qt::Drawer Sheet Dialog
Qt::Popup 0x00000008 Window
Qt::Tool Popup Dialog
Qt::ToolTip Popup Sheet
Qt::SplashScreen ToolTip Dialog
Qt::Desktop 0x00000010 Window
Qt::SubWindow 0x00000012 指示此小部件是子窗口,例如QMdiSubWindow小部件
Qt::ForeignWindow 0x00000020 Window
Qt::CoverWindow 0x00000040 Window
  • 窗口提示可以有多个(不一定会生效,看平台是否支持)
枚举 值(十六进制) 描述
Qt::FramelessWindowHint 0x00000800 产生一个无边框的窗口。用户不能通过窗口系统移动或调整无边框窗口的大小
Qt::NoDropShadowWindowHint 0x40000000 去掉窗口阴影
Qt::CustomizeWindowHint 0x02000000 关闭默认的窗口标题提示
Qt::WindowTitleHint 0x00001000 给窗口一个标题栏
Qt::WindowSystemMenuHint 0x00002000 添加一个窗口系统菜单,可能还有一个关闭按钮(例如在Mac上)。如果你需要隐藏或显示关闭按钮,使用WindowCloseButtonHint更便于移植。
Qt::WindowMinimizeButtonHint 0x00004000 添加一个最小化按钮
Qt::WindowMaximizeButtonHint 0x00008000 添加一个最大化按钮
Qt::WindowMinMaxButtonsHint WindowMinimizeButtonHint WindowMaximizeButtonHint
Qt::WindowCloseButtonHint 0x08000000 添加一个关闭按钮
Qt::WindowContextHelpButtonHint 0x00010000 向对话框添加上下文帮助按钮
Qt::WindowStaysOnTopHint 0x00040000 通知窗口系统该窗口应该位于所有其他窗口的顶部
Qt::WindowStaysOnBottomHint 0x04000000 通知窗口系统该窗口应位于所有其他窗口的底部

附录二

  • 窗口状态 Qt::WindowState
枚举 描述
Qt::WindowNoState 0x00000000 窗口没有状态设置(正常状态)
Qt::WindowMinimized 0x00000001 窗口被最小化(即图标化)
Qt::WindowMaximized 0x00000002 窗户周围有一个框架,使其最大化
Qt::WindowFullScreen 0x00000004 窗口填充了整个屏幕,周围没有任何边框
Qt::WindowActive 0x00000008 该窗口是活动窗口,即它有键盘焦点
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 内存
    +关注

    关注

    8

    文章

    2909

    浏览量

    73591
  • API
    API
    +关注

    关注

    2

    文章

    1461

    浏览量

    61539
  • 窗口
    +关注

    关注

    0

    文章

    66

    浏览量

    10805
收藏 人收藏

    评论

    相关推荐

    基于模糊聚表征的音频例子检索及相关反馈

    避免先前基于例子的音频检索要按照监督机制训练不同类别的复杂的音频模板,直接从原始音频流中提取压缩域特征,使用时空约束机制进行压缩域特征的模糊聚,用聚结果的质心来表征整个音频例子,基于聚质心完成
    发表于 03-06 22:10

    运行Qt程序时出错:undefined symbol: _ZN7QWidget8qwsEventEP8QWSEvent

    symbol: _ZN7QWidget8qwsEventEP8QWSEventexport QTDIR=/Qt4_5_3forARMexport LD_LIBRARY_PATH=$QTDIR/lib:$LD_LIBRARY_PATH请问哪位前辈知道这个错误的原因和解决方法?非常感谢!
    发表于 02-26 16:14

    Qt学习常用的

    )QPushButton按钮布局管理器:QGridLayout网格布局addWidget(QWidget *parent, int row, int coloum);有很都的重载函数addWidget(a
    发表于 10-18 09:47

    荣小菜补钙记第15期:相关操作BUG分享

    荣小菜补钙记第15期:相关操作BUG分享 同步更新于 WeChat:荣小菜在补钙大家好,我是荣小菜,也可以叫我Richie,今天分享两个刚刚遇到的关于
    发表于 03-03 21:45

    串口控制LED之上位机界面设计步骤

    测试验证。1、新建一个serial_led工程这里需要注意的一点是:工程名及工程路径不要有中文字符。另外,QT中有三种基,这里我们选择QWidget。QT的三个基如:QMainW
    发表于 01-18 06:49

    HarmonyOS方舟开发框架容器API的介绍与使用

    容量的1.5倍。Stack底层基于数组实现,入栈出栈均从数组的一端操作,Stack进行增、删、改、查操作相关API如下: (二)非线性容器 非线性容器
    发表于 03-07 11:40

    gstreamer采用waylandsink并绑定到QWidget失败?

      我现在在RK3568平台下想基于QT+Gstreamer开发媒体播放器,   gstreamer部分我采用了waylandsink,想将Gstreamer的播放绑定到QT的一个QWidget窗口
    发表于 05-11 16:01

    什么是

    什么是是描述对象的“基本原型”,它定义一种对象所能拥有的数据和能完成的操作,在面向对象的程序设计中,是程序的基
    发表于 04-28 14:24 1735次阅读
    什么是<b class='flag-5'>类</b>?

    DXP考证操作 (跟作业相关,可供参考)

    DXP考证操作 (跟作业相关,可供参考)请笑纳
    发表于 05-10 11:21 0次下载

    标准IO的操作原理及操作函数相关资料下载

    标准IO的操作原理及操作函数相关资料下载
    发表于 04-03 16:53 4次下载

    系数和度相关性均可调的HK扩展模型

    现有的社交网络增长演化模型的度相关性大多为负值。针对这种情况,以HK(Holme和Kim)模型为基础,考虑社交网络中度的正相关特性以及高聚系数的特征,提出一种适用于构造社交网络的演化增长模型。首先
    发表于 12-12 11:39 5次下载
    聚<b class='flag-5'>类</b>系数和度<b class='flag-5'>相关</b>性均可调的HK扩展模型

    AB放大器偏置的比较定义操作及频率摘要

    电路AB放大器。然后,AB放大器输出级结合了A放大器和B放大器的优点,同时最大限度地减少了与它们相关的低效率和失真问题。
    的头像 发表于 06-27 15:45 1w次阅读
    AB<b class='flag-5'>类</b>放大器偏置的比较定义<b class='flag-5'>操作</b>及频率摘要

    Arduino 位操作相关函数

    Arduino 位操作相关函数官方参考文档:https://www.arduino.cc/reference/en/bit()bit(n);//计算指定位的值//返回值: bit类型0或者1void
    发表于 01-13 13:56 3次下载
    Arduino 位<b class='flag-5'>操作</b><b class='flag-5'>相关</b>函数

    数据标注相关文章:揭秘数据标注的奥秘

    数据标注相关文章:揭秘数据标注的奥秘 随着人工智能技术的不断发展,数据标注已成为人工智能领域中必不可少的一环。数据标注是指将人工标注的数据集分发给无人驾驶车辆、智能医疗设备、自然语言处理模型等需要
    的头像 发表于 05-16 17:35 694次阅读

    一个简单的点灯上位机编程实例分析

    QWidget:所有用户界面对象的基,窗口部件是用户界面的一个基本单元,它从窗口系统接收鼠标,键盘和其他消息,并在屏幕上绘制自己。
    发表于 06-30 11:40 1562次阅读
    一个简单的点灯上位机编程实例分析