前言
- Qt原本的窗口虽然可以通过QSS样式进行美化,但是只是对客户区有用,对于客户区是无效的 。所以想做出一个比较好看的程序,还得自己重写实现无边框窗口 。
- Qt实现无边框其实一句代码就可以,但是窗口自带的缩放,移动功和关闭功能都会没有,需要自己重写 。
setWindowFlags(Qt::FramelessWindowHint);
文章插图
文章插图
2.由于无边框窗口没有了标题栏和最小化,最大化,关闭的按钮,所以需要自己布局相对应的控件,并重写事件 。我的布局如下
文章插图
3.事件对应代码
展开
4.窗口移动事件,需要重写鼠标的点击事件和移动事件//窗口关闭事件void MainWindow::windowClose(){qApp->exit();}//窗口最小化void MainWindow::windowMin(){this->showMinimized();}//窗口最大化void MainWindow::windowMax(){isMaxWin=!isMaxWin;if(isMaxWin)//根据是否最大化窗口,改变对应的图标{ui->btnMax->setIcon(QIcon(":/icons/normal.png"));this->showMaximized();}else{ui->btnMax->setIcon(QIcon(":/icons/maxsize.png"));this->showNormal();}}
展开
3.窗口的缩放功能比较麻烦,需要用到windows的消息机制.代码如下void MainWindow::mousePressEvent(QMouseEvent*event){if(event->button()==Qt::LeftButton) //如果鼠标左键按下{isPressed=true;curPos=event->pos();//记录当前的点击坐标}}void MainWindow::mouseMoveEvent(QMouseEvent*event){if(isPressed) //如果鼠标左键按下{this->move(event->pos()-curPos+this->pos());//窗口移动}}//鼠标释放void MainWindow::mouseReleaseEvent(QMouseEvent*event){isPressed=false;}
展开
4.要实现窗口的正常功能,还需要对窗口的Flags进行一些设置,同时也要给父类设置,要不然会有问题的.//需要包含头文件/*#include <qt_windows.h>#include <Windowsx.h>*///消息处理bool MainWindow::nativeEvent(const QByteArray &eventType, void *message, long *result){int m_nBorder = 5;//边界宽度Q_UNUSED(eventType)MSG *param = static_cast<MSG *>(message);switch (param->message){case WM_NCHITTEST:{int nX = GET_X_LPARAM(param->lParam) - this->geometry().x();int nY = GET_Y_LPARAM(param->lParam) - this->geometry().y();*result = HTCAPTION;//判断鼠标位置是否位于窗口边界if ((nX > 0) && (nX < m_nBorder))*result = HTLEFT;if ((nX > this->width() - m_nBorder) && (nX < this->width()))*result = HTRIGHT;if ((nY > 0) && (nY < m_nBorder))*result = HTTOP;if ((nY > this->height() - m_nBorder) && (nY < this->height()))*result = HTBOTTOM;if ((nX > 0) && (nX < m_nBorder) && (nY > 0)&& (nY < m_nBorder))*result = HTTOPLEFT;if ((nX > this->width() - m_nBorder) && (nX < this->width())&& (nY > 0) && (nY < m_nBorder))*result = HTTOPRIGHT;if ((nX > 0) && (nX < m_nBorder)&& (nY > this->height() - m_nBorder) && (nY < this->height()))*result = HTBOTTOMLEFT;if ((nX > this->width() - m_nBorder) && (nX < this->width())&& (nY > this->height() - m_nBorder) && (nY < this->height()))*result = HTBOTTOMRIGHT;if (*result == HTCAPTION){return false;}return true;}}return QMainWindow::nativeEvent(eventType, message, result);}
文章插图
其中 Qt::FramelessWindowHint设置窗口为无边框,Qt::Window表示widegt为窗口,Qt::WindowMinimizeButtonHint 程序在任务栏被点击时能够显示/隐藏.
经验总结扩展阅读
- 无线蓝牙耳机哪个品牌好 蓝牙耳机品牌排行榜前十名
- 感慨人生无奈的句子160句
- 京东一年换新是无理由换新吗 京东一年免费换新条件是怎么样的
- 【Azure 事件中心】Event Hub 无法连接,出现 Did not observe any item or terminal signal within 60000ms in 'flatMapMany' 的错误消息
- 形容无耻小人的句子 送给玩心眼的人的句子
- 无期迷途灼热之风怎么获取
- 我的世界怎么去月球无模组无指令(我的世界新版怎么去月球)
- 2022UUCTF--WEB
- 枕头过高真的能无忧吗 枕头要不要太高
- 我的世界虚无3月球怎么去(我的世界虚无世界怎么找传送门)