Qt 使用-自定义菜单栏

Qt 学习笔记

使用Qt设计及界面时,常用的两种方式添加菜单,第一使用UI界面添加,第二种 在代码中添加菜单。

本次示例,为加深学习映象,故混合使用

使用UI添加菜单

直接在菜单栏输入:

 注意: 子菜单可能无法输入中文,可在Action Editor 中修改文本与提示信息

使用代码

QMenuBar --菜单栏类:菜单栏类给窗口提供水平菜单栏,此菜单栏占用窗口上方区域,垂直高度不变,水平宽度为窗口宽度,可随窗口大小变化而变化。

QMenu --菜单项,包含各个子菜单。QMenu还可以用来创建弹出菜单

QAction --子菜单,一个子菜单对应一个操作。

 源码:

如果出现以下错误

检查是否有菜单项没有初始化

如:我的pMenuTest1 没有初始化

 源码:

mainwindow.h

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>

QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACE

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    MainWindow(QWidget *parent = nullptr);
    ~MainWindow();

    //菜单栏
    QMenuBar *pMenuBar;
    //菜单项
    QMenu *pMenuTest;

    //子菜单
    QAction *pActionTest;
    QAction *pActionTest1;

public slots:
    void openFileWindow();

private:
    Ui::MainWindow *ui;   
};
#endif // MAINWINDOW_H

mainwindow.cpp

 我使用utf-8 可能存在乱码现象,使用

QStringLiteral("中文") 解决
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QFileDialog>

#define USE_DEFAULT_MENU_BAR "use_default_menu_bar"

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    //指定菜单栏
#ifdef USE_DEFAULT_MENU_BAR
    //添加菜单栏(此处添加为的为QMainWindow自带的菜单)
    pMenuBar = this->menuBar();
#else
    //添加自定义菜单
    pMenuBar = new QMenuBar(this);
#endif
    //定义菜单项
    //(&n)代表快捷方式,当窗口获得焦点时按alt+n即可打开“测试”菜单项
    pMenuTest = new QMenu(QStringLiteral("构建(&D)"),this);

    //定义子菜单
    //(&s)为子菜单快捷键,当打开该菜单项后,按下‘s’键即可响应
    pActionTest = new QAction(QStringLiteral("构建所有项目(&S)"),this);
    //新建一个带图标的菜单项,图标使用资源文件中的资源
    pActionTest1 = new QAction(QIcon(":/new/prefix1/resource/soccer_ball.ico"),QStringLiteral("执行QMark"),this);
    //将菜单项添加到子菜单
    pMenuTest->addAction(pActionTest);
    pMenuTest->addAction(pActionTest1);
    //在菜单项之间添加分割线
    pMenuTest->addSeparator();

    //将子菜单添加到菜单栏
    pMenuBar->addMenu(pMenuTest);

#ifndef USE_DEFAULT_MENU_BAR
    //当不使用QMainWindow自带的菜单栏时,必须要加上此行
    setMenuBar(pMenuBar);
#endif
    //添加菜单响应函数
    connect(ui->actionOpenFileProj,SIGNAL(triggered()), this, SLOT(openFileWindow()));
    connect(pActionTest,&QAction::triggered,this,&MainWindow::openFileWindow);

}

MainWindow::~MainWindow()
{
    delete ui;
}

void MainWindow::openFileWindow(){
     QString fileName = QFileDialog::getOpenFileName(NULL, QStringLiteral("导入bin文件"),".",QStringLiteral("文本文件(*.bin);;所有文件 (*.*)"));
}

 

 运行效果:

 点击打开项目

参考:

Qt基础之菜单栏 - kyzc - 博客园 

 

您可以通过以下步骤自定义Qt主窗口的标题栏: 1. 在Qt设计器中,将窗口的标题栏设置为无(TitleBar->NoTitle)。 2. 在窗口中添加一个QWidget作为自定义标题栏。 3. 在自定义标题栏中添加需要的控件,比如QPushButton、QLabel等。 4. 重写窗口的鼠标事件,实现拖动窗口的功能。为此,您需要在窗口中实现mousePressEvent、mouseMoveEvent和mouseReleaseEvent三个事件函数。 5. 在mousePressEvent中,记录鼠标点击位置,用于计算窗口的移动距离。 6. 在mouseMoveEvent中,计算鼠标移动距离,并根据距离移动窗口。 7. 在mouseReleaseEvent中,清除记录的鼠标点击位置。 8. 最后,将自定义标题栏添加到窗口中,调整位置和大小即可。 下面是一个示例代码,可以帮助您更好地理解如何实现自定义标题栏: ```cpp #include <QtGui> #include <QtWidgets> class CustomTitleBar : public QWidget { public: CustomTitleBar(QWidget* parent = nullptr) : QWidget(parent) { setFixedHeight(30); QLabel* titleLabel = new QLabel("Custom Title Bar"); QPushButton* minimizeButton = new QPushButton("-"); QPushButton* maximizeButton = new QPushButton("□"); QPushButton* closeButton = new QPushButton("X"); QHBoxLayout* layout = new QHBoxLayout(this); layout->addWidget(titleLabel); layout->addStretch(); layout->addWidget(minimizeButton); layout->addWidget(maximizeButton); layout->addWidget(closeButton); connect(minimizeButton, &QPushButton::clicked, parent, &QWidget::showMinimized); connect(maximizeButton, &QPushButton::clicked, parent, &QWidget::showMaximized); connect(closeButton, &QPushButton::clicked, parent, &QWidget::close); } }; class MainWindow : public QMainWindow { public: MainWindow(QWidget* parent = nullptr) : QMainWindow(parent) { setWindowTitle("Custom Title Bar"); CustomTitleBar* titleBar = new CustomTitleBar(this); setMenuWidget(titleBar); QVBoxLayout* layout = new QVBoxLayout; QLabel* label = new QLabel("Hello, World!"); layout->addWidget(label); QWidget* centralWidget = new QWidget; centralWidget->setLayout(layout); setCentralWidget(centralWidget); } protected: void mousePressEvent(QMouseEvent* event) override { if (event->button() == Qt::LeftButton) { m_dragPosition = event->globalPos() - frameGeometry().topLeft(); event->accept(); } } void mouseMoveEvent(QMouseEvent* event) override { if (event->buttons() & Qt::LeftButton) { move(event->globalPos() - m_dragPosition); event->accept(); } } void mouseReleaseEvent(QMouseEvent* event) override { if (event->button() == Qt::LeftButton) { m_dragPosition = QPoint(); event->accept(); } } private: QPoint m_dragPosition; }; int main(int argc, char* argv[]) { QApplication app(argc, argv); MainWindow window; window.show(); return app.exec(); } ``` 在这个示例中,我们首先实现了一个CustomTitleBar类,该类继承自QWidget,用于创建自定义的标题栏。在CustomTitleBar中,我们添加了一个QLabel和三个QPushButton,分别用于显示标题、最小化窗口、最大化/还原窗口和关闭窗口。我们通过QHBoxLayout将这些控件添加到CustomTitleBar中,并使用connect函数将这些按钮的点击事件连接到MainWindow的相应函数。 在MainWindow中,我们创建了一个CustomTitleBar对象,并使用setMenuWidget函数将其设置为菜单栏。然后,我们创建了一个QVBoxLayout,并向其中添加一个QLabel。最后,我们将QVBoxLayout设置为中心部件,并通过setCentralWidget函数将其添加到MainWindow中。 对于拖动窗口的实现,我们重写了MainWindow的mousePressEvent、mouseMoveEvent和mouseReleaseEvent三个函数。在mousePressEvent中,我们记录了鼠标点击位置,用于计算窗口的移动距离。在mouseMoveEvent中,我们计算了鼠标移动距离,并根据距离移动窗口。在mouseReleaseEvent中,我们清除了记录的鼠标点击位置。 最后,我们创建了一个QApplication对象,并显示了MainWindow。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值