void MinimizeAppBtnClicked()
{
showMinimized();
}
void MaximizeAppBtnClicked()
{
maximizeBtn->hide();
maximizeBtn->setChecked(false);
normalBtn->show();
normalBtn->setChecked(false);
hide();//有些时候点击最大化按钮不起作用,所以先hide一下
showMaximized();
}
void NormalAppBtnClicked()
{
maximizeBtn->show();
maximizeBtn->setChecked(false);
normalBtn->hide();
normalBtn->setChecked(false);
showNormal();
}
用上面的代码会有一个问题:
widgets freezing after minimise window(点击图标,app不刷新,设置setWindowFlags(Qt::FramelessWindowHint)引起)
What happened: Window stopped redrawing. It looked frozen.
I was debugging it and found out following:
After minimizing window attribute Qt::WA_Mapped
was removed from QMainWindow (you can set breakpoint to setAttribute_internal
in qwidget.cpp
to check it). But this attribute was not set again after showing window. This caused that condition if (discardSyncRequest(tlw, tlwExtra))
in QWidgetBackingStore::sync
was not met and it caused dirtyWidgets
are not cleared. In other part of Qt updating system this caused that no other rendering was made.
Workaround I did: Subclassed QMainWindow
and set attribute Qt::WA_Mapped
manually when window was restored (handling changeEvent):
void changeEvent(QEvent * event)
{
if(event->type() == QEvent::WindowStateChange)
{
if(!isMinimized())
{
setAttribute(Qt::WA_Mapped);
}
}
QWidget::changeEvent(event);
}
移动、最大化状态时拖动标题栏变成normal状态(部分代码)
void mousePressEvent(QMouseEvent *event)
{
QPoint pointpos = event->pos();
QRect rect(0,0,this->width(),25);
if (rect.contains(pointpos))
{
QRect screenRect = QApplication::desktop()->screenGeometry();
if (screenRect.width() != size().width())
{
m_bMovable = true;
m_lastMousePos = event->globalPos();
}
m_bIsMousePressed = true;
}
else
{
m_bMovable = false;
}
}
void mouseMoveEvent(QMouseEvent *event)
{
if (!m_bIsMousePressed)
{
return;
}
QRect screenRect = QApplication::desktop()->screenGeometry();
if (screenRect.width() == size().width())
{
int nRectX = event->globalPos().x() - normalGeometry().width()/2;
if (nRectX < 0)
{
nRectX = 0;
}
if (nRectX > size().width() - normalGeometry().width())
{
nRectX = size().width() - normalGeometry().width();
}
QRect IniNormalRect(nRectX,0,normalGeometry().width(),normalGeometry().height());
setGeometry(IniNormalRect);
ui->maximizeBtn->show();
ui->maximizeBtn->setChecked(false);
ui->normalBtn->hide();
ui->normalBtn->setChecked(false);
}
else if (m_bMovable)
{
move(event->globalPos() - m_lastMousePos + pos());
m_lastMousePos = event->globalPos();
}
}
void mouseReleaseEvent(QMouseEvent *event)
{
m_bMovable = false;
m_bIsMousePressed = false;
}