一、无边框窗口问题/需求汇总:
1、 窗口最大化时闪屏、卡顿问题。
2、 鼠标左键可移动窗口,但只在窗口上下左右30以内区域可移动,其它地方不可移动。
3、 双屏幕时,窗口最大、向下还原需要在当前屏幕显示,不回到主屏幕。
4、 窗口正常显示时在屏幕中间区域。
5、 窗口最大化显示时,不能被任务栏给遮挡。
二、代码:
1、自定义MainWindow成员变量:
bool m_bPressed = false; //移动窗口: 鼠标左键是否按下
QPoint m_pressPoint; //移动窗口: 鼠标左键按下的坐标
bool m_bWindowNormal = true; //true: 当前窗口Normal false: 当前窗口Max
2、将窗口设置为无边框:
setWindowFlags(windowFlags() | Qt::FramelessWindowHint);
3、自定义MainWindow成员函数:
void MainWindow::mousePressEvent(QMouseEvent * event)
{
QMainWindow::mouseMoveEvent(event);
//解决:鼠标左键可移动窗口,但只在窗口上下左右30以内区域可移动,其它地方不可移动。
if ((event->button() == Qt::LeftButton)
&& ((event->pos().y() < 30 && event->pos().y() > 0) //上面区域30以内
|| (event->pos().x() < 30 && event->pos().x() > 0) //左面区域30以内
|| (event->pos().x() < this->width() && event->pos().x() > this->width() - 30) //右面区域30以内
|| (event->pos().y() < this->height() && event->pos().y() > this->height() - 30))) //下面区域30以内
{
m_bPressed = true;
m_pressPoint = event->pos();
}
else
{
m_bPressed = false;
}
}
void MainWindow::mouseReleaseEvent(QMouseEvent * event)
{
QMainWindow::mouseReleaseEvent(event);
if (m_bPressed)
{
m_bPressed = false;
}
}
void MainWindow::mouseMoveEvent(QMouseEvent * event)
{
QMainWindow::mouseMoveEvent(event);
if (m_bPressed)
{
QPoint parentPoint = this->pos();
parentPoint.setX(parentPoint.x() + event->x() - m_pressPoint.x());
parentPoint.setY(parentPoint.y() + event->y() - m_pressPoint.y());
this->move(parentPoint);
}
}
void MainWindow::slotMinimizeToolButtonClicked()
{
this->showMinimized();
}
void MainWindow::slotMaximizeToolButtonClicked()
{
QDesktopWidget * deskTop = QApplication::desktop();
//screenNumber获取软件所在屏幕Number,再配合其它代码,解决:双屏幕时,窗口最大、向下还原需要在当前屏幕显示,不回到主屏幕。
int curMonitor = deskTop->screenNumber(this);
//availableGeometry()获取屏幕可用部分Rect,解决:窗口最大化显示时,不能被任务栏给遮挡。
QRect screenRect = deskTop->availableGeometry(curMonitor);
if (m_bWindowNormal)
{
m_bWindowNormal = false;
ui.maximizeToolButton->setIcon(QIcon(":/Title/Resources/images/RestoreDown.png"));
ui.maximizeToolButton->setIconSize(ui.maximizeToolButton->size());
ui.maximizeToolButton->setToolTip(TR("Restore Down"));
//setFixedSize()固定窗口大小,解决:窗口最大化时闪屏、卡顿问题。
this->setFixedSize(screenRect.width(), screenRect.height());
this->move(screenRect.x(), screenRect.y());
}
else
{
m_bWindowNormal = true;
ui.maximizeToolButton->setIcon(QIcon(":/Title/Resources/images/maximize.png"));
ui.maximizeToolButton->setIconSize(ui.maximizeToolButton->size());
ui.maximizeToolButton->setToolTip(TR("Maximize"));
this->setFixedSize(1200, 840);
//解决: 窗口正常显示时在屏幕中间区域。
int x = (screenRect.width() - this->width()) / 2;
int y = (screenRect.height() - this->height()) / 2;
this->move(screenRect.x() + x, screenRect.y() + y);
}
}
void MainWindow::slotClotureToolButtonClicked()
{
QString title = TR("Information");
QString strInfo = TR("Do you want to exit the system ?");
ScanMessageBox messageBox;
messageBox.SetTitle(title);
messageBox.SetMessage(strInfo);
auto code = messageBox.exec();
if (code == QDialog::Accepted)
{
this->close();
}
标签:窗口,Qt,MainWindow,30,pos,边框,screenRect,event
From: https://blog.csdn.net/weixin_44629261/article/details/144979771