QWidget類是所有窗口類的父類(控件類是也屬于窗口類), 并且QWidget類的父類的QObject, 也就意味著所有的窗口類對(duì)象只要指定了父對(duì)象, 都可以實(shí)現(xiàn)內(nèi)存資源的自動(dòng)回收。這里給大家介紹一下關(guān)于這個(gè)類常用的一些API函數(shù)。
// 構(gòu)造函數(shù)
QWidget::QWidget(QWidget *parent = nullptr, Qt::WindowFlags f = Qt::WindowFlags());
// 公共成員函數(shù)
// 給當(dāng)前窗口設(shè)置父對(duì)象
void QWidget::setParent(QWidget *parent);
void QWidget::setParent(QWidget *parent, Qt::WindowFlags f);
// 獲取當(dāng)前窗口的父對(duì)象, 沒(méi)有父對(duì)象返回 nullptr
QWidget *QWidget::parentWidget() const;
//------------- 窗口位置 -------------
// 得到相對(duì)于當(dāng)前窗口父窗口的幾何信息, 邊框也被計(jì)算在內(nèi)
QRect QWidget::frameGeometry() const;
// 得到相對(duì)于當(dāng)前窗口父窗口的幾何信息, 不包括邊框
const QRect& geometry() const;
// 設(shè)置當(dāng)前窗口的幾何信息(位置和尺寸信息), 不包括邊框
void setGeometry(int x, int y, int w, int h);
void setGeometry(const QRect &);
//此屬性保存小部件的內(nèi)部幾何形狀,不包括任何窗口框架,等于QRect(0,0, width(), height())
QRect rect();
//獲取小控件在父控件中的位置
QPoint pos() const
// 移動(dòng)窗口, 重新設(shè)置窗口的位置
void move(int x, int y);
void move(const QPoint &);
//------------- 窗口尺寸 -------------
// 獲取當(dāng)前窗口的尺寸信息
QSize size() const
// 重新設(shè)置窗口的尺寸信息
void resize(int w, int h);
void resize(const QSize &);
// 獲取當(dāng)前窗口的最大尺寸信息
QSize maximumSize() const;
// 獲取當(dāng)前窗口的最小尺寸信息
QSize minimumSize() const;
// 設(shè)置當(dāng)前窗口固定的尺寸信息
void QWidget::setFixedSize(const QSize &s);
void QWidget::setFixedSize(int w, int h);
// 設(shè)置當(dāng)前窗口的最大尺寸信息
void setMaximumSize(const QSize &);
void setMaximumSize(int maxw, int maxh);
// 設(shè)置當(dāng)前窗口的最小尺寸信息
void setMinimumSize(const QSize &);
void setMinimumSize(int minw, int minh);
// 獲取當(dāng)前窗口的高度
int height() const;
// 獲取當(dāng)前窗口的最小高度
int minimumHeight() const;
// 獲取當(dāng)前窗口的最大高度
int maximumHeight() const;
// 給窗口設(shè)置固定的高度
void QWidget::setFixedHeight(int h);
// 給窗口設(shè)置最大高度
void setMaximumHeight(int maxh);
// 給窗口設(shè)置最小高度
void setMinimumHeight(int minh);
// 獲取當(dāng)前窗口的寬度
int width() const;
// 獲取當(dāng)前窗口的最小寬度
int minimumWidth() const;
// 獲取當(dāng)前窗口的最大寬度
int maximumWidth() const;
// 給窗口設(shè)置固定寬度
void QWidget::setFixedWidth(int w);
// 給窗口設(shè)置最大寬度
void setMaximumWidth(int maxw);
// 給窗口設(shè)置最小寬度
void setMinimumWidth(int minw);
//------------- 窗口圖標(biāo) -------------
// 得到當(dāng)前窗口的圖標(biāo)
QIcon windowIcon() const;
// 構(gòu)造圖標(biāo)對(duì)象, 參數(shù)為圖片的路徑
QIcon::QIcon(const QString &fileName);
// 設(shè)置當(dāng)前窗口的圖標(biāo)
void setWindowIcon(const QIcon &icon);
/*--Slots--*/
//------------- 窗口標(biāo)題 -------------
// 得到當(dāng)前窗口的標(biāo)題
QString windowTitle() const;
// 設(shè)置當(dāng)前窗口的標(biāo)題
void setWindowTitle(const QString &);
void setWindowModified(bool)
// 判斷窗口是否可用
bool isEnabled() const;
// 設(shè)置窗口是否可用, 不可用窗口無(wú)法接收和處理窗口事件
void setEnabled(bool);
//------------- 窗口顯示 -------------
// 關(guān)閉當(dāng)前窗口
[slot] bool QWidget::close();
// 隱藏當(dāng)前窗口
[slot] void QWidget::hide();
// 顯示當(dāng)前創(chuàng)建以及其子窗口
[slot] void QWidget::show();
//設(shè)置窗口是否可見(jiàn)
virtual void setVisible(bool visible)
// 全屏顯示當(dāng)前窗口, 只對(duì)windows有效
[slot] void QWidget::showFullScreen();
// 窗口最大化顯示, 只對(duì)windows有效
[slot] void QWidget::showMaximized();
// 窗口最小化顯示, 只對(duì)windows有效
[slot] void QWidget::showMinimized();
// 將窗口回復(fù)為最大化/最小化之前的狀態(tài), 只對(duì)windows有效
[slot] void QWidget::showNormal();
//------------- 信號(hào) -------------
// QWidget::setContextMenuPolicy(Qt::ContextMenuPolicy policy);
// 窗口的右鍵菜單策略 contextMenuPolicy() 參數(shù)設(shè)置為 Qt::CustomContextMenu, 按下鼠標(biāo)右鍵發(fā)射該信號(hào)
[signal] void QWidget::customContextMenuRequested(const QPoint &pos);
// 窗口圖標(biāo)發(fā)生變化, 發(fā)射此信號(hào)
[signal] void QWidget::windowIconChanged(const QIcon &icon);
// 窗口標(biāo)題發(fā)生變化, 發(fā)射此信號(hào)
[signal] void QWidget::windowTitleChanged(const QString &title);
設(shè)置鼠標(biāo)樣式
Qcursor
//獲取鼠標(biāo)的全局坐標(biāo)
[static] QPoint pos()
[static] QPoint pos(const QScreen *screen)
//將鼠標(biāo)移動(dòng)到全局的指定坐標(biāo)
[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在多屏幕的時(shí)候可用
- 以下代碼可以通過(guò)點(diǎn)擊按鈕切換并查看所有鼠標(biāo)的(內(nèi)置)形狀
-
QPushButton*btn = new QPushButton("切換鼠標(biāo)形狀",this); connect(btn,&QPushButton::clicked,this,[=]() { static int i = 0; this->setCursor(Qt::CursorShape(i)); qDebug()<<"切換成功"<
- 除了內(nèi)置形狀之外,還可以自定義鼠標(biāo)形狀
QPixmap* cursorPixmaps[2]={new QPixmap("://images/cursor_one.png"),
new QPixmap("://images/cursor_two.png")};
QPushButton*btn = new QPushButton("切換鼠標(biāo)樣式",this);
connect(btn,&QPushButton::clicked,this,[=]()
{
static int i = 0;
setCursor(QCursor(*cursorPixmaps[i]));
i = (i+1)%2;
});
setWhatsThis
setToolTip用來(lái)設(shè)置提示信息,那么setWhatsThis是用來(lái)干嘛的呢?顧名思義就是用來(lái)說(shuō)明這是啥玩意的
- 先創(chuàng)建三個(gè)按鈕
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("打開(kāi)文件");
btn1->setWhatsThis("open a new file");
btn2->setToolTip("新建文件");
btn2->setWhatsThis("create a new file");
btn3->setToolTip("查看");
btn3->setWhatsThis("查看其他按鈕的詳細(xì)信息");
connect(btn3,&QPushButton::clicked,this,[=]()
{
QWhatsThis::enterWhatsThisMode();
});
- 運(yùn)行程序后按Shift + F1會(huì)出現(xiàn)當(dāng)前獲得焦點(diǎn)的widget的whatsThis信息
- 調(diào)用QWhatsThis的靜態(tài)函數(shù)enterWhatsThisMode進(jìn)入whatsThis模式,此時(shí)當(dāng)鼠標(biāo)移動(dòng)到設(shè)置了whatsThis的widget上光標(biāo)會(huì)出現(xiàn)一個(gè)問(wèn)號(hào),再點(diǎn)擊則會(huì)出現(xiàn)whatsThis的窗口。
設(shè)置窗口圖標(biāo)
- 修改窗口和任務(wù)欄顯示的圖標(biāo)
this->setWindowIcon(QIcon("://images/snowBall.png"));
設(shè)置應(yīng)用程序圖標(biāo)
簡(jiǎn)單三步,搞定~
-
1,創(chuàng)建一個(gè)圖標(biāo)格式(ico)的文件,
可以將一個(gè)普通的圖片轉(zhuǎn)成.ico格式的圖標(biāo)文件
圖片格式在線轉(zhuǎn)換
-
2,將轉(zhuǎn)換好的ico文件放到源文件所在目錄,即和.pro文件同級(jí)目錄
-
3,在.pro項(xiàng)目文件中添加如下代碼
zay.ico 即圖標(biāo)名
RC_ICONS += zay.ico
發(fā)布程序
Qt 官方開(kāi)發(fā)環(huán)境使用的動(dòng)態(tài)鏈接庫(kù)方式,在發(fā)布生成的exe程序時(shí),需要復(fù)制一大堆 dll,如果自己去復(fù)制dll,很可能丟三落四,導(dǎo)致exe在別的電腦里無(wú)法正常運(yùn)行。因此 Qt 官方開(kāi)發(fā)環(huán)境里自帶了一個(gè)工具:windeployqt.exe(這個(gè)文件在Qt安裝目錄的bin文件下可以找到)
不同的編譯器和版本需要使用不同的windeployqt版本打包
以官方 Qt 5.14.2+MinGW32 開(kāi)發(fā)環(huán)境為例:
- 1,通過(guò)Qt命令行運(yùn)行windeployqt工具,開(kāi)始菜單->Qt 5.14.2->5.4->MinGW 4.9 (32-bit)->Qt 5.14.2 (MinGW 7.3.0 32-bit)
- 把需要打包的Qt可執(zhí)行程序拷貝到一個(gè)單獨(dú)的文件夾里面,然后再把命令行工作目錄切換到該文件夾
- 最后執(zhí)行命令
windeployqt maye.exe
show,hide,setVisible,setHidden,close 小結(jié)
- 0,在Qt中如果一定要自己釋放對(duì)象,官方推薦使用
[slot] void QObject::deleteLater()
來(lái)釋放對(duì)象 - 1,
[slot] void setVisible(bool visible)
設(shè)置Widget可見(jiàn)或不可見(jiàn) - 2,
slot] void QWidget::setHidden(bool *hidden*)
1號(hào)的馬甲 - 3,
[slot] void QWidget::show()
1號(hào)的馬甲 - 4,
[slot] void QWidget::hide()
1號(hào)的馬甲 - 5,
[slot] bool QWidget::close()
看情況調(diào)用4號(hào)或者0號(hào)(該部件是否有父部件)
呵呵,show()、hide()、setVisible()、setHidden() 這4個(gè)函數(shù)讓人看得眼花繚亂。怎么辦?
看看代碼吧:
virtual void setVisible(bool visible);
inline void setHidden(bool hidden) { setVisible(!hidden); }
inline void show() { setVisible(true); }
inline void hide() { setVisible(false); }
代碼很清楚:這四個(gè)東西之中,只有 setVisible 是獨(dú)立的,其他三個(gè)都是它的馬甲!setVisible 的作用是什么呢?顧名思義,使得一個(gè)Widget可見(jiàn)或不可見(jiàn)。 要點(diǎn) :不可見(jiàn),是Widget不在界面上顯示,但不代表對(duì)象被析構(gòu)!
//[1]創(chuàng)建關(guān)閉自己的按鈕
QPushButton* closeBtn = new QPushButton("closeSelf",this);
connect(closeBtn,&QPushButton::clicked,this,&Widget::close);
//點(diǎn)擊右上角關(guān)閉按鈕會(huì)銷毀窗口
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); //點(diǎn)擊關(guān)閉按鈕時(shí)銷毀窗口
connect(subWidget,&QWidget::destroyed,this,[=](){qDebug()<<"subWidget destroyed";});
//[3]創(chuàng)建關(guān)閉子窗口的按鈕
QPushButton*closeSubWidgetBtn = new QPushButton("closeSubWidget",this);
closeSubWidgetBtn->move(100,0);
connect(closeSubWidgetBtn,&QPushButton::clicked,subWidget,[=](){
subWidget->close();
subWidget->deleteLater(); //推薦這樣銷毀對(duì)象
qDebug()<
坐標(biāo)轉(zhuǎn)換
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
這幾個(gè)函數(shù)都是轉(zhuǎn)換相對(duì)坐標(biāo)系用的. 用另一個(gè)坐標(biāo)系統(tǒng)的坐標(biāo)值, 來(lái)表達(dá)當(dāng)前坐標(biāo)系統(tǒng)中某個(gè)坐標(biāo)所指向的某個(gè)點(diǎn),
記住: 一定要先確兩個(gè)坐標(biāo)系統(tǒng)再確定一個(gè)點(diǎn)
- 相對(duì)坐標(biāo) :獲取自己相對(duì)于父控件的位置 QWidget::pos()
- 絕對(duì)坐標(biāo) :將當(dāng)前控件的相對(duì)位置轉(zhuǎn)換為屏幕絕對(duì)位置 QWidget::mapToGlobal()
- 絕對(duì)坐標(biāo)轉(zhuǎn)為相對(duì)坐標(biāo) :將絕對(duì)位置對(duì)應(yīng)到控件的相對(duì)位置 QWidget::mapFromGlobal()
設(shè)置窗口標(biāo)志
- 用Qt寫一個(gè)窗口,如果繼承QDialog,那窗口就只有關(guān)閉按鈕,如果繼承QWidget,那么就有關(guān)閉,最大化,最小化三個(gè)按鈕,怎樣才能讓關(guān)閉按鈕可用,而最大化和最小化按鈕不可用呢?
//僅僅顯示關(guān)閉按鈕,添加一個(gè)幫助按鈕?
this->setWindowFlags(Qt::WindowType::WindowCloseButtonHint | Qt::WindowContextHelpButtonHint);
//從窗口標(biāo)志中移除幫助按鈕標(biāo)志
this->setWindowFlags(windowFlags() & ~Qt::WindowContextHelpButtonHint);
//移除標(biāo)志或單純添加一個(gè)標(biāo)志,可以用一下簡(jiǎn)單的函數(shù)true為設(shè)置,false為移除
this->setWindowFlag(Qt::WindowContextHelpButtonHint,false);
- 更多標(biāo)志詳見(jiàn)附錄一(文章底部)
設(shè)置窗口狀態(tài)
- 將窗口狀態(tài)設(shè)置為windowState。窗口狀態(tài)是附錄二(文章底部)中狀態(tài)的組合。
- 如果窗口不可見(jiàn)(即isVisible()返回false),窗口狀態(tài)將在調(diào)用show()時(shí)生效。對(duì)于可見(jiàn)窗口,更改是立即的。例如,要在全屏模式和普通模式之間切換,請(qǐng)使用以下代碼:
w->setWindowState(w->windowState() ^ Qt::WindowFullScreen);
- 為了恢復(fù)和激活最小化的窗口(同時(shí)保持其最大化和/或全屏狀態(tài)),使用以下方法:
w->setWindowState((w->windowState() & ~Qt::WindowMinimized) | Qt::WindowActive);
- 調(diào)用這個(gè)函數(shù)將隱藏小部件。必須調(diào)用show()使小部件再次可見(jiàn),在某些窗口系統(tǒng)中,Qt::WindowActive不是立即的,在某些情況下可能會(huì)被忽略。
設(shè)置屬性
- setAttribute用來(lái)設(shè)置小部件的屬性,testAttribute查看是否設(shè)置了某種屬性。
常用屬性
枚舉 | 值(十進(jìn)制) | 描述 |
---|---|---|
Qt::WA_AcceptDrops | 78 | 允許來(lái)自拖放操作的數(shù)據(jù)被拖放到小部件上(參見(jiàn)QWidget::setAcceptDrops()) |
Qt::WA_AlwaysShowToolTips | 84 | 為非活動(dòng)窗口啟用工具提示 |
Qt::WA_CustomWhatsThis | 47 | 表示小部件希望在“這是什么?”模式下繼續(xù)正常運(yùn)行。這是由小部件的作者設(shè)置的。 |
Qt::WA_DeleteOnClose | 55 | 使Qt在小部件接受關(guān)閉事件時(shí)刪除該小部件 |
Qt::WA_MouseTracking | 2 | 指示小部件啟用了鼠標(biāo)跟蹤。參見(jiàn)QWidget:: mouseTracking |
Qt::WA_TranslucentBackground | 120 | 指示小部件應(yīng)該有一個(gè)半透明的背景,也就是說(shuō),小部件的任何非透明區(qū)域都將是半透明的,因?yàn)樾〔考⒂幸粋€(gè)alpha通道。設(shè)置此標(biāo)志將導(dǎo)致設(shè)置WA_NoSystemBackground。在Windows上,小部件還需要設(shè)置Qt:: framesswindowhint窗口標(biāo)志。該標(biāo)志由小部件的作者設(shè)置或清除。 |
附錄一
- 此枚舉類型用于為小部件指定各種窗口系統(tǒng)屬性。它們相當(dāng)不尋常,但在少數(shù)情況下是必要的。其中一些標(biāo)志取決于底層窗口管理器是否支持它們。
枚舉 | 值(十六進(jìn)制) | 描述 |
---|---|---|
Qt::Widget | 0x00000000 | 這是QWidget的默認(rèn)類型。這種類型的小部件如果有父部件,則為子部件,如果沒(méi)有父部件,則為獨(dú)立窗口。 |
Qt::Window | 0x00000001 | 指示小部件是一個(gè)窗口,通常帶有窗口系統(tǒng)框架和標(biāo)題欄,而不管小部件是否有父窗口。 |
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 |
- 窗口提示可以有多個(gè)(不一定會(huì)生效,看平臺(tái)是否支持)
枚舉 | 值(十六進(jìn)制) | 描述 |
---|---|---|
Qt::FramelessWindowHint | 0x00000800 | 產(chǎn)生一個(gè)無(wú)邊框的窗口。用戶不能通過(guò)窗口系統(tǒng)移動(dòng)或調(diào)整無(wú)邊框窗口的大小 |
Qt::NoDropShadowWindowHint | 0x40000000 | 去掉窗口陰影 |
Qt::CustomizeWindowHint | 0x02000000 | 關(guān)閉默認(rèn)的窗口標(biāo)題提示 |
Qt::WindowTitleHint | 0x00001000 | 給窗口一個(gè)標(biāo)題欄 |
Qt::WindowSystemMenuHint | 0x00002000 | 添加一個(gè)窗口系統(tǒng)菜單,可能還有一個(gè)關(guān)閉按鈕(例如在Mac上)。如果你需要隱藏或顯示關(guān)閉按鈕,使用WindowCloseButtonHint更便于移植。 |
Qt::WindowMinimizeButtonHint | 0x00004000 | 添加一個(gè)最小化按鈕 |
Qt::WindowMaximizeButtonHint | 0x00008000 | 添加一個(gè)最大化按鈕 |
Qt::WindowMinMaxButtonsHint | WindowMinimizeButtonHint | WindowMaximizeButtonHint |
Qt::WindowCloseButtonHint | 0x08000000 | 添加一個(gè)關(guān)閉按鈕 |
Qt::WindowContextHelpButtonHint | 0x00010000 | 向?qū)υ捒蛱砑由舷挛膸椭粹o |
Qt::WindowStaysOnTopHint | 0x00040000 | 通知窗口系統(tǒng)該窗口應(yīng)該位于所有其他窗口的頂部 |
Qt::WindowStaysOnBottomHint | 0x04000000 | 通知窗口系統(tǒng)該窗口應(yīng)位于所有其他窗口的底部 |
附錄二
- 窗口狀態(tài)
Qt::WindowState
枚舉 | 值 | 描述 |
---|---|---|
Qt::WindowNoState | 0x00000000 | 窗口沒(méi)有狀態(tài)設(shè)置(正常狀態(tài)) |
Qt::WindowMinimized | 0x00000001 | 窗口被最小化(即圖標(biāo)化) |
Qt::WindowMaximized | 0x00000002 | 窗戶周圍有一個(gè)框架,使其最大化 |
Qt::WindowFullScreen | 0x00000004 | 窗口填充了整個(gè)屏幕,周圍沒(méi)有任何邊框 |
Qt::WindowActive | 0x00000008 | 該窗口是活動(dòng)窗口,即它有鍵盤焦點(diǎn) |
-
內(nèi)存
+關(guān)注
關(guān)注
8文章
3028瀏覽量
74082 -
API
+關(guān)注
關(guān)注
2文章
1502瀏覽量
62080 -
窗口
+關(guān)注
關(guān)注
0文章
66瀏覽量
10860
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論