Qt之重写标题栏
在项目开发中,我们一般不会使用QMainWindow中的标题栏,因为qss无法设置其风格样式,程序运行起来后标题栏为白边,与主窗体风格严重冲突,不美观。
(1)修改前窗口展示如下:
(2)跟着本章修改完成后展示:
1.新建窗口
新建MainWindow窗口,删除标题栏,添加label_Image,用于添加标题图标;添加label_Title,用于添加标题文本;添加关闭、最大化、最小化三个按钮。
2.设置窗口属性
2.1设置窗口为无边框窗口
this->setWindowFlags(Qt::FramelessWindowHint);
2.2设置控件样式
ui->label_Title->setText("新的窗口");
QPixmap pixmap;
bool res = pixmap.load("../res/image/image.png");
pixmap = pixmap.scaled(24,24,Qt::KeepAspectRatio);
ui->label_Image->setPixmap(pixmap);
ui->pushButton_max->setStyleSheet("background-color:transparent;");
ui->pushButton_close->setStyleSheet("background-color:transparent;");
ui->pushButton_min->setStyleSheet("background-color:transparent;");
ui->pushButton_max->setIcon(QIcon("../res/image/max_normal.png"));
ui->pushButton_close->setIcon(QIcon("../res/image/close_hover.png"));
ui->pushButton_min->setIcon(QIcon("../res/image/min_normal.png"));
3.窗口控制按钮信号
3.1最小化
void MainWindow::on_pushButton_min_clicked()
{
this->showMinimized();
}
3.2最大化
void MainWindow::on_pushButton_max_clicked()
{
if(this->isMaximized())
{
ui->pushButton_max->setIcon(QIcon("../res/image/normal_normal.png"));
this->showNormal();
}
else
{
ui->pushButton_max->setIcon(QIcon("../res/image/max_normal.png"));
this->showMaximized();
}
}
3.3关闭窗口
void MainWindow::on_pushButton_close_clicked()
{
this->close();
}
4.窗口移动
由于窗口删除了标题栏,窗口无法移动,所以需要重载鼠标按压、释放、移动函数实现窗口移动功能。
4.1鼠标按压
void MainWindow::mousePressEvent(QMouseEvent *event)
{
if(event->button() == Qt::LeftButton)
{
mousePress = true;
}
movePoint = event->globalPos() - this->pos();
}
4.2鼠标释放
void MainWindow::mouseReleaseEvent(QMouseEvent *event)
{
mousePress = false;
}
4.3鼠标移动
void MainWindow::mouseMoveEvent(QMouseEvent *event)
{
if(mousePress)
{
QPoint movePos = event->globalPos();
this->move(movePos - movePoint);
}
}