概述
一.问题概述及思路
问题描述:QMainWindow默认调用windows系统自带边框,部分情况不符合使用需求。
解决思路:
1.重写QMenuBar插入MainWindow
Qt实现Offce2016系列Ribbon效果
2.QWidget插入MainWindow(setMenuWidget(w);本文采用方法)
3.重写QMainWindow。
参考Github上
二.代码
头文件
#ifndef KQTILTLE_H
#define KQTILTLE_H
#include <QWidget>
#include <QPushButton>
namespace Ui {
class KQTiltle;
}
class KQTiltle : public QWidget
{
Q_OBJECT
public:
explicit KQTiltle(QWidget *parent = 0);
~KQTiltle();
protected:
virtual void mousePressEvent(QMouseEvent *event);
virtual void mouseReleaseEvent(QMouseEvent *event);
virtual void mouseMoveEvent(QMouseEvent *event);
private slots:
void on_toolButton_minimize_clicked();
void on_toolButton_window_clicked();
void on_toolButton_close_clicked();
void on_pushBtn_clicked();
public:
QPushButton* m_btCloseCurPage; //关闭当前页按钮
private:
Ui::KQTiltle *ui;
QPoint m_PointOldPos;
bool m_bMouseDown;
bool m_CheckIsRunning; //标记任务检查页当前是否在进行任务检查 当进行检查时,跳转页的槽禁止响应
};
#endif // KQTILTLE_H
源文件:
#include "kqtiltle.h"
#include "ui_kqtiltle.h"
//#include <QMenu>
#include <QMessageBox>
#include <QMouseEvent>
#include "mainwindow.h"
#include "Dlg.h"
KQTiltle::KQTiltle(QWidget *parent) :
QWidget(parent),
ui(new Ui::KQTiltle)
,m_CheckIsRunning(false)
,m_btCloseCurPage(nullptr)
{
ui->setupUi(this);
// setMouseTracking(true);
// ui->widget_TitleTool->setMouseTracking(true);
// ui->widget_menu->setMouseTracking(true);
ui->widget_menu->layout()->setAlignment(ui->toolButton_help,Qt::AlignTop);
m_btCloseCurPage = ui->pushButton_closeCurPage;
//m_btCloseCurPage->hide();
ui->pushButton_CheckSet->hide();
}
KQTiltle::~KQTiltle()
{
delete ui;
}
void KQTiltle::on_toolButton_minimize_clicked()
{
QWidget* pWindow=parentWidget()->parentWidget();
if(pWindow)
{
pWindow->showMinimized();
}
}
void KQTiltle::on_toolButton_window_clicked()
{
QWidget* pWindow=parentWidget()->parentWidget();
if(pWindow)
{
pWindow->isMaximized() ? pWindow->showNormal() : pWindow->showMaximized();
}
}
void KQTiltle::on_toolButton_close_clicked()
{
// int nReg = QMessageBox::question(this,QString::fromLocal8Bit("提示"),QString::fromLocal8Bit("你确定要关闭吗?"),QMessageBox::Yes | QMessageBox::No);
// if(nReg ==QMessageBox::Yes)
// {
QWidget* pWindow=parentWidget()->parentWidget();
if(pWindow)
{
pWindow->close();
}
// }
}
void KQTiltle::mousePressEvent(QMouseEvent *e)
{
if(e->pos().y()>150) return;
m_PointOldPos = e->pos();
m_bMouseDown = e->button() == Qt::LeftButton;
}
void KQTiltle::mouseMoveEvent(QMouseEvent *e)
{
int x = e->x();
int y = e->y();
if (m_bMouseDown) {
int dx = x - m_PointOldPos.x();
int dy = y - m_PointOldPos.y();
QWidget* pWindow=parentWidget()->parentWidget();
QRect g = pWindow->geometry();
g.setRect(g.x()+dx,g.y()+dy,g.width(),g.height());
pWindow->setGeometry(g);
}
}
void KQTiltle::mouseReleaseEvent(QMouseEvent *e)
{
m_bMouseDown = false;
}
void KQTiltle::on_pushBtn_clicked()
{
Dlg* dlg = new Dlg(this);
dlg->exec();
}
调用
setWindowFlags(Qt::Window|Qt::FramelessWindowHint |Qt::WindowSystemMenuHint|Qt::WindowMinimizeButtonHint|Qt::WindowMaximizeButtonHint);
QWidget* w=new QWidget(this);
w->setObjectName("mTitle");
m_titleBar=new KQTiltle(w);
w->setLayout(new QHBoxLayout(w));
w->layout()->setSpacing(0);
w->layout()->setMargin(0);
w->layout()->addWidget(m_titleBar);
this->setMenuWidget(w);
最后
以上就是自觉白开水为你收集整理的QMainWindow无边框(自定义标题栏)一.问题概述及思路二.代码的全部内容,希望文章能够帮你解决QMainWindow无边框(自定义标题栏)一.问题概述及思路二.代码所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复