QWidget類是所有窗口類的父類(控件類是也屬于窗口類), 并且QWidget類的父類的QObject, 也就意味著所有的窗口類對象只要指定了父對象, 都可以實現(xiàn)內存資源的自動回收。這里給大家介紹一下關于這個類常用的一些API函數(shù)。
// 構造函數(shù)
QWidget::QWidget(QWidget *parent = nullptr, Qt::WindowFlags f = Qt::WindowFlags());
// 公共成員函數(shù)
// 給當前窗口設置父對象
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;
// 構造圖標對象, 參數(shù)為圖片的路徑
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() 參數(shù)設置為 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會出現(xiàn)當前獲得焦點的widget的whatsThis信息
- 調用QWhatsThis的靜態(tài)函數(shù)enterWhatsThisMode進入whatsThis模式,此時當鼠標移動到設置了whatsThis的widget上光標會出現(xiàn)一個問號,再點擊則會出現(xiàn)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個函數(shù)讓人看得眼花繚亂。怎么辦?
看看代碼吧:
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
這幾個函數(shù)都是轉換相對坐標系用的. 用另一個坐標系統(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);
//移除標志或單純添加一個標志,可以用一下簡單的函數(shù)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);
- 調用這個函數(shù)將隱藏小部件。必須調用show()使小部件再次可見,在某些窗口系統(tǒng)中,Qt::WindowActive不是立即的,在某些情況下可能會被忽略。
設置屬性
- setAttribute用來設置小部件的屬性,testAttribute查看是否設置了某種屬性。
常用屬性
枚舉 | 值(十進制) | 描述 |
---|---|---|
Qt::WA_AcceptDrops | 78 | 允許來自拖放操作的數(shù)據(jù)被拖放到小部件上(參見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)屬性。它們相當不尋常,但在少數(shù)情況下是必要的。其中一些標志取決于底層窗口管理器是否支持它們。
枚舉 | 值(十六進制) | 描述 |
---|---|---|
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 | 該窗口是活動窗口,即它有鍵盤焦點 |
-
內存
+關注
關注
8文章
2966瀏覽量
73812 -
API
+關注
關注
2文章
1472瀏覽量
61749 -
窗口
+關注
關注
0文章
66瀏覽量
10832
發(fā)布評論請先 登錄
相關推薦
評論