1.隱藏標題欄、工具窗口以及窗口置頂
setWindowFlags(Qt::FramelessWindowHint | Qt::Tool | Qt::WindowStaysOnTopHint);
2.設置窗體透明度
setWindowOpacity(0.7);
3.隱藏標題欄後實現拖動
隱藏標題欄後窗體是無法拖動的,這個時候就需要重寫mousePressEvent、mouseMoveEvent和mouseReleaseEvent。
添加一個成員變量QPoint。
private:
QPoint m_lastPos;
重寫mousePressEvent、mouseMoveEvent和mouseReleaseEvent函數。
void mousePressEvent(QMouseEvent *event)
{
m_lastPos = event->globalPos();
}
void mouseMoveEvent(QMouseEvent *event)
{
this->move(this->x() + (event->globalX() - m_lastPos.x()),
this->y() + (event->globalY() - m_lastPos.y()));
m_lastPos = event->globalPos();
}
void mouseReleaseEvent(QMouseEvent *event)
{
// 其實這裏的mouseReleaseEvent函數可以不用重寫
m_lastPos = event->globalPos();
}
4.解決鼠標按下其他控件後移動鼠標到QWidget區域時界面移動的問題
按照上面的寫法,會出現一個問題,就是在按住當前界面上的控件時,當按住這個動作一直存在並將鼠標從控件移動到QWidget的區域時,界面也會跟着移動,並且這樣的移動時直接跳了過去,這樣就很不完美,而且在界面很小,控件很多的情況下,拖動顯得非常卡頓,所以我們就需要在mouse事件中添加一個判斷,判斷當前鼠標按下是否是處於QWidget所在的區域。
修改很簡單,在自定義QWidget界面類中添加一個bool型變量isPressedWidget。
bool isPressedWidget;
然後在mousePressEvent、mouseMoveEvent和mouseReleaseEvent三個函數中各添上一行。
void mousePressEvent(QMouseEvent *event)
{
m_lastPos = event->globalPos();
isPressedWidget = true; // 當前鼠標按下的即是QWidget而非界面上佈局的其它控件
}
void mouseMoveEvent(QMouseEvent *event)
{
if (isPressedWidget) {
this->move(this->x() + (event->globalX() - m_lastPos.x()),
this->y() + (event->globalY() - m_lastPos.y()));
m_lastPos = event->globalPos();
}
}
void mouseReleaseEvent(QMouseEvent *event)
{
// 其實這裏的mouseReleaseEvent函數可以不用重寫
m_lastPos = event->globalPos();
isPressedWidget = false; // 鼠標鬆開時,置爲false
}
5.美化自定義窗口
在爲自定義窗口類使用qss美化(解決qss對QWidget修改樣式表無效,可參考這篇文章:解決Qt使用qss時對QWidget無效)。
在對窗體設置了背景圖片,如果背景圖片是不規則矩形,則在背景圖片後,窗體會露出一部分很醜,這個時候可以將窗體的屬性設爲透明屬性。
setAttribute(Qt::WA_TranslucentBackground);