我是靠谱客的博主 自觉白开水,最近开发中收集的这篇文章主要介绍QMainWindow无边框(自定义标题栏)一.问题概述及思路二.代码,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

一.问题概述及思路

问题描述: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无边框(自定义标题栏)一.问题概述及思路二.代码所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(48)

评论列表共有 0 条评论

立即
投稿
返回
顶部