我想在 qt 中创建一个自定义标题栏

Posted

技术标签:

【中文标题】我想在 qt 中创建一个自定义标题栏【英文标题】:I want to create a custom title bar in qt 【发布时间】:2017-04-10 09:22:14 【问题描述】:

所以我查找了一些示例并遵循了它们。 这是应用示例的代码。

小部件头文件:

#include <QWidget>
#include <QMouseEvent>

class KcWdTitlebar :public QWidget

private:
    QWidget *m_parent;
    QPoint m_pCursor;

public:
    KcWdTitlebar( QWidget *parent) ;

protected:
    void mousePressEvent(QMouseEvent *event);
    void mouseMoveEvent(QMouseEvent *event);
;

小部件 cpp:

KcWdTitlebar::KcWdTitlebar(QWidget *parent ) :m_parent(parent)

    QLabel *title = new QLabel(parent->windowTitle());
    QPushButton *pPB = new QPushButton ("x");

    QHBoxLayout *layout = new QHBoxLayout(this);
    layout->addWidget(title);
    layout->addWidget(pPB);

    connect(pPB,SIGNAL(clicked()),parent,SLOT(close()));


void KcWdTitlebar::mousePressEvent(QMouseEvent *event)

    if(event->button() == Qt::LeftButton)
    
        m_pCursor = event->globalPos() - geometry().topLeft();
        event->accept();
    


void KcWdTitlebar::mouseMoveEvent(QMouseEvent *event)

    if(event->buttons() & Qt::LeftButton)
    
        m_parent->move(event->globalPos() - m_pCursor);
        event->accept();
    

主窗口标题:

#include <QMainWindow>
#include "KcWdTitlebar.h"

namespace Ui 
class mainwindow;


class mainwindow : public QMainWindow

    Q_OBJECT

public:
    explicit mainwindow(QWidget *parent = 0);
    ~mainwindow();

private:
    KcWdTitlebar *m_title;
    Ui::mainwindow *ui;
;

ma​​inwidow cpp:

mainwindow::mainwindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::mainwindow)

    ui->setupUi(this);
    m_title = new KcWdTitlebar(this);
    ui->verticalLayout->addWidget(m_title);


当我运行这段代码时, 单击并拖动 KcWdTitle 部分将导致主窗口比我单击的点更远。

我应该修复代码的哪些部分?

希望大家都能听懂我的英文。

【问题讨论】:

尝试更改:void KcWdTitlebar::mousePressEvent(QMouseEvent *event)void KcWdTitlebar::mouseMoveEvent(QMouseEvent *event),看看行为是否有变化。如果是这种情况,那么这是您应该更改的部分。 Ui::mainwindow 的完整定义在哪里? @DavidGrayson Ui::mainwindow 中没有太多内容。我刚刚将 KcWdTitlebar 添加到框架的顶部。 【参考方案1】:

您需要更改mousePressEvent() 以减去MainWindow 几何而不是标题栏的几何。

变化:

m_pCursor = event->globalPos() - geometry().topLeft();

到这里:

m_pCursor = event->globalPos() - m_parent->geometry().topLeft();

【讨论】:

以上是关于我想在 qt 中创建一个自定义标题栏的主要内容,如果未能解决你的问题,请参考以下文章

我想在 iPad 应用程序中创建一个行为类似于操作表的自定义视图

如何在 Flutter 中创建像这样的自定义可滑动标签栏?

导航栏高度和自定义按钮

如何在 React Native 中创建自定义顶部导航栏

自定义画QMainWindow标题栏

如何在 Swift Xcode 中创建自定义导航栏?