0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領取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();
 // 顯示當前創(chuàng)建以及其子窗口
 [slot] void QWidget::show();
 //設置窗口是否可見
 virtual void setVisible(bool visible)

 // 全屏顯示當前窗口, 只對windows有效
 [slot] void QWidget::showFullScreen();
 // 窗口最大化顯示, 只對windows有效
 [slot] void QWidget::showMaximized();
 // 窗口最小化顯示, 只對windows有效
 [slot] void QWidget::showMinimized();
 // 將窗口回復為最大化/最小化之前的狀態(tài), 只對windows有效
 [slot] void QWidget::showNormal();


 //------------- 信號 -------------
 // QWidget::setContextMenuPolicy(Qt::ContextMenuPolicy policy);
 // 窗口的右鍵菜單策略 contextMenuPolicy() 參數設置為 Qt::CustomContextMenu, 按下鼠標右鍵發(fā)射該信號
 [signal] void QWidget::customContextMenuRequested(const QPoint &pos);
 // 窗口圖標發(fā)生變化, 發(fā)射此信號
 [signal] void QWidget::windowIconChanged(const QIcon &icon);
 // 窗口標題發(fā)生變化, 發(fā)射此信號
 [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是用來干嘛的呢?顧名思義就是用來說明這是啥玩意的

  • 先創(chuàng)建三個按鈕
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的靜態(tài)函數enterWhatsThisMode進入whatsThis模式,此時當鼠標移動到設置了whatsThis的widget上光標會出現一個問號,再點擊則會出現whatsThis的窗口。

設置窗口圖標

  • 修改窗口和任務欄顯示的圖標
this->setWindowIcon(QIcon("://images/snowBall.png"));

設置應用程序圖標

簡單三步,搞定~

  • 1,創(chuàng)建一個圖標格式(ico)的文件,可以將一個普通的圖片轉成.ico格式的圖標文件

    圖片格式在線轉換

  • 2,將轉換好的ico文件放到源文件所在目錄,即和.pro文件同級目錄

  • 3,在.pro項目文件中添加如下代碼zay.ico 即圖標名

RC_ICONS += zay.ico

發(fā)布程序

Qt 官方開發(fā)環(huán)境使用的動態(tài)鏈接庫方式,在發(fā)布生成的exe程序時,需要復制一大堆 dll,如果自己去復制dll,很可能丟三落四,導致exe在別的電腦里無法正常運行。因此 Qt 官方開發(fā)環(huán)境里自帶了一個工具:windeployqt.exe(這個文件在Qt安裝目錄的bin文件下可以找到)

不同的編譯器和版本需要使用不同的windeployqt版本打包

以官方 Qt 5.14.2+MinGW32 開發(fā)環(huán)境為例:

  • 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可執(zhí)行程序拷貝到一個單獨的文件夾里面,然后再把命令行工作目錄切換到該文件夾
  • 最后執(zhí)行命令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]創(chuàng)建關閉自己的按鈕
 QPushButton* closeBtn = new QPushButton("closeSelf",this);
 connect(closeBtn,&QPushButton::clicked,this,&Widget::close);
 //點擊右上角關閉按鈕會銷毀窗口
 connect(this,&QObject::destroyed,this,[](){qDebug()<<"this destroyed";});

 //[2]創(chuàng)建子窗口
 QWidget* subWidget = new QWidget;
 subWidget->setWindowTitle("subWidget");
 subWidget->show();
 //subWidget->setAttribute(Qt::WidgetAttribute::WA_DeleteOnClose);   //點擊關閉按鈕時銷毀窗口        
 connect(subWidget,&QWidget::destroyed,this,[=](){qDebug()<<"subWidget destroyed";});
 //[3]創(chuàng)建關閉子窗口的按鈕
 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

這幾個函數都是轉換相對坐標系用的. 用另一個坐標系統(tǒng)的坐標值, 來表達當前坐標系統(tǒng)中某個坐標所指向的某個點,

記住: 一定要先確兩個坐標系統(tǒng)再確定一個點

  • 相對坐標 :獲取自己相對于父控件的位置 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);
  • 更多標志詳見附錄一(文章底部)

設置窗口狀態(tài)

  • 將窗口狀態(tài)設置為windowState。窗口狀態(tài)是附錄二(文章底部)中狀態(tài)的組合。
  • 如果窗口不可見(即isVisible()返回false),窗口狀態(tài)將在調用show()時生效。對于可見窗口,更改是立即的。例如,要在全屏模式和普通模式之間切換,請使用以下代碼:
w->setWindowState(w->windowState() ^ Qt::WindowFullScreen);
  • 為了恢復和激活最小化的窗口(同時保持其最大化和/或全屏狀態(tài)),使用以下方法:
w->setWindowState((w->windowState() & ~Qt::WindowMinimized) | Qt::WindowActive);
  • 調用這個函數將隱藏小部件。必須調用show()使小部件再次可見,在某些窗口系統(tǒng)中,Qt::WindowActive不是立即的,在某些情況下可能會被忽略。

設置屬性

  • setAttribute用來設置小部件的屬性,testAttribute查看是否設置了某種屬性。

常用屬性

枚舉 值(十進制) 描述
Qt::WA_AcceptDrops 78 允許來自拖放操作的數據被拖放到小部件上(參見QWidget::setAcceptDrops())
Qt::WA_AlwaysShowToolTips 84 為非活動窗口啟用工具提示
Qt::WA_CustomWhatsThis 47 表示小部件希望在“這是什么?”模式下繼續(xù)正常運行。這是由小部件的作者設置的。
Qt::WA_DeleteOnClose 55 使Qt在小部件接受關閉事件時刪除該小部件
Qt::WA_MouseTracking 2 指示小部件啟用了鼠標跟蹤。參見QWidget:: mouseTracking
Qt::WA_TranslucentBackground 120 指示小部件應該有一個半透明的背景,也就是說,小部件的任何非透明區(qū)域都將是半透明的,因為小部件將有一個alpha通道。設置此標志將導致設置WA_NoSystemBackground。在Windows上,小部件還需要設置Qt:: framesswindowhint窗口標志。該標志由小部件的作者設置或清除。

附錄一

  • 此枚舉類型用于為小部件指定各種窗口系統(tǒng)屬性。它們相當不尋常,但在少數情況下是必要的。其中一些標志取決于底層窗口管理器是否支持它們。
枚舉 值(十六進制) 描述
Qt::Widget 0x00000000 這是QWidget的默認類型。這種類型的小部件如果有父部件,則為子部件,如果沒有父部件,則為獨立窗口。
Qt::Window 0x00000001 指示小部件是一個窗口,通常帶有窗口系統(tǒng)框架和標題欄,而不管小部件是否有父窗口。
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 產生一個無邊框的窗口。用戶不能通過窗口系統(tǒng)移動或調整無邊框窗口的大小
Qt::NoDropShadowWindowHint 0x40000000 去掉窗口陰影
Qt::CustomizeWindowHint 0x02000000 關閉默認的窗口標題提示
Qt::WindowTitleHint 0x00001000 給窗口一個標題欄
Qt::WindowSystemMenuHint 0x00002000 添加一個窗口系統(tǒng)菜單,可能還有一個關閉按鈕(例如在Mac上)。如果你需要隱藏或顯示關閉按鈕,使用WindowCloseButtonHint更便于移植。
Qt::WindowMinimizeButtonHint 0x00004000 添加一個最小化按鈕
Qt::WindowMaximizeButtonHint 0x00008000 添加一個最大化按鈕
Qt::WindowMinMaxButtonsHint WindowMinimizeButtonHint WindowMaximizeButtonHint
Qt::WindowCloseButtonHint 0x08000000 添加一個關閉按鈕
Qt::WindowContextHelpButtonHint 0x00010000 向對話框添加上下文幫助按鈕
Qt::WindowStaysOnTopHint 0x00040000 通知窗口系統(tǒng)該窗口應該位于所有其他窗口的頂部
Qt::WindowStaysOnBottomHint 0x04000000 通知窗口系統(tǒng)該窗口應位于所有其他窗口的底部

附錄二

  • 窗口狀態(tài) Qt::WindowState
枚舉 描述
Qt::WindowNoState 0x00000000 窗口沒有狀態(tài)設置(正常狀態(tài))
Qt::WindowMinimized 0x00000001 窗口被最小化(即圖標化)
Qt::WindowMaximized 0x00000002 窗戶周圍有一個框架,使其最大化
Qt::WindowFullScreen 0x00000004 窗口填充了整個屏幕,周圍沒有任何邊框
Qt::WindowActive 0x00000008 該窗口是活動窗口,即它有鍵盤焦點
聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規(guī)問題,請聯系本站處理。 舉報投訴
  • 內存
    +關注

    關注

    8

    文章

    2942

    瀏覽量

    73727
  • API
    API
    +關注

    關注

    2

    文章

    1464

    瀏覽量

    61670
  • 窗口
    +關注

    關注

    0

    文章

    66

    瀏覽量

    10821
收藏 人收藏

    評論

    相關推薦

    基于模糊聚表征的音頻例子檢索及相關反饋

    避免先前基于例子的音頻檢索要按照監(jiān)督機制訓練不同類別的復雜的音頻模板,直接從原始音頻流中提取壓縮域特征,使用時空約束機制進行壓縮域特征的模糊聚,用聚結果的質心來表征整個音頻例子,基于聚質心完成
    發(fā)表于 03-06 22:10

    運行Qt程序時出錯:undefined symbol: _ZN7QWidget8qwsEventEP8QWSEvent

    symbol: _ZN7QWidget8qwsEventEP8QWSEventexport QTDIR=/Qt4_5_3forARMexport LD_LIBRARY_PATH=$QTDIR/lib:$LD_LIBRARY_PATH請問哪位前輩知道這個錯誤的原因和解決方法?非常感謝!
    發(fā)表于 02-26 16:14

    Qt學習常用的

    )QPushButton按鈕布局管理器:QGridLayout網格布局addWidget(QWidget *parent, int row, int coloum);有很都的重載函數addWidget(a
    發(fā)表于 10-18 09:47

    榮小菜補鈣記第15期:相關操作BUG分享

    榮小菜補鈣記第15期:相關操作BUG分享 同步更新于 WeChat:榮小菜在補鈣大家好,我是榮小菜,也可以叫我Richie,今天分享兩個剛剛遇到的關于
    發(fā)表于 03-03 21:45

    串口控制LED之上位機界面設計步驟

    測試驗證。1、新建一個serial_led工程這里需要注意的一點是:工程名及工程路徑不要有中文字符。另外,QT中有三種基,這里我們選擇QWidget。QT的三個基如:QMainW
    發(fā)表于 01-18 06:49

    HarmonyOS方舟開發(fā)框架容器API的介紹與使用

    容量的1.5倍。Stack底層基于數組實現,入棧出棧均從數組的一端操作,Stack進行增、刪、改、查操作相關API如下: (二)非線性容器 非線性容器
    發(fā)表于 03-07 11:40

    gstreamer采用waylandsink并綁定到QWidget失敗?

      我現在在RK3568平臺下想基于QT+Gstreamer開發(fā)媒體播放器,   gstreamer部分我采用了waylandsink,想將Gstreamer的播放綁定到QT的一個QWidget窗口
    發(fā)表于 05-11 16:01

    什么是?

    什么是是描述對象的“基本原型”,它定義一種對象所能擁有的數據和能完成的操作,在面向對象的程序設計中,是程序的基
    發(fā)表于 04-28 14:24 ?1755次閱讀
    什么是<b class='flag-5'>類</b>?

    DXP考證操作 (跟作業(yè)相關,可供參考)

    DXP考證操作 (跟作業(yè)相關,可供參考)請笑納
    發(fā)表于 05-10 11:21 ?0次下載

    標準IO的操作原理及操作函數相關資料下載

    標準IO的操作原理及操作函數相關資料下載
    發(fā)表于 04-03 16:53 ?4次下載

    系數和度相關性均可調的HK擴展模型

    現有的社交網絡增長演化模型的度相關性大多為負值。針對這種情況,以HK(Holme和Kim)模型為基礎,考慮社交網絡中度的正相關特性以及高聚系數的特征,提出一種適用于構造社交網絡的演化增長模型。首先
    發(fā)表于 12-12 11:39 ?5次下載
    聚<b class='flag-5'>類</b>系數和度<b class='flag-5'>相關</b>性均可調的HK擴展模型

    AB放大器偏置的比較定義操作及頻率摘要

    電路AB放大器。然后,AB放大器輸出級結合了A放大器和B放大器的優(yōu)點,同時最大限度地減少了與它們相關的低效率和失真問題。
    的頭像 發(fā)表于 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
    發(fā)表于 01-13 13:56 ?3次下載
    Arduino 位<b class='flag-5'>操作</b><b class='flag-5'>相關</b>函數

    數據標注相關文章:揭秘數據標注的奧秘

    數據標注相關文章:揭秘數據標注的奧秘 隨著人工智能技術的不斷發(fā)展,數據標注已成為人工智能領域中必不可少的一環(huán)。數據標注是指將人工標注的數據集分發(fā)給無人駕駛車輛、智能醫(yī)療設備、自然語言處理模型等需要
    的頭像 發(fā)表于 05-16 17:35 ?715次閱讀

    一個簡單的點燈上位機編程實例分析

    QWidget:所有用戶界面對象的基,窗口部件是用戶界面的一個基本單元,它從窗口系統(tǒng)接收鼠標,鍵盤和其他消息,并在屏幕上繪制自己。
    發(fā)表于 06-30 11:40 ?1633次閱讀
    一個簡單的點燈上位機編程實例分析