VS+Qt 如何实现自定义菜单栏

功能界面

在这里插入图片描述

自定义菜单栏实现

mymenu.h定义槽函数:

private slots:

void on_actionOpen_triggered();
void on_actionSave_triggered();
void on_actionExit_triggered();
void on_actionMain_triggered();
void on_actionWarmUp_triggered();
void on_actionTest_triggered();
void on_actionRun_triggered();
void on_actionOptim_triggered();

mymenu.cpp中实现菜单栏自定义:

void MyMenu::iniMenuBar()
{
	QHBoxLayout* hlay = new QHBoxLayout(this);
	hlay->setMargin(0);
	QMenuBar *menuBar = new QMenuBar(this);
	//菜单文件
	QMenu* fileMenu = menuBar->addMenu(QStringLiteral("文件(&F)"));// QStringLiteral(
	QAction* actOpenFile = new QAction(QStringLiteral("打开文件(&O)"));
	QAction* actSaveFile = new QAction(QStringLiteral("保存(&S)"));
	QAction* actExit = new QAction(QStringLiteral("退出(&Q)"));
	connect(actOpenFile, SIGNAL(triggered()), this, SLOT(on_actionOpen_triggered()));
	connect(actSaveFile, SIGNAL(triggered()), this, SLOT(on_actionSave_triggered()));
	connect(actExit, SIGNAL(triggered()), this, SLOT(on_actionExit_triggered()));
	fileMenu->addAction(actOpenFile);
	fileMenu->addAction(actExit);

	// 菜单视图
	QMenu* backMenu = menuBar->addMenu(QStringLiteral("视图(&B)"));
	QAction* actBackParams = new QAction(QStringLiteral("主参数界面(&M)"));
	QAction* actionWarmUp = new QAction(QStringLiteral("暖机界面(&W)"));
	connect(actBackParams, SIGNAL(triggered()), this, SLOT(on_actionMain_triggered()));
	connect(actionWarmUp, SIGNAL(triggered()), this, SLOT(on_actionWarmUp_triggered()));
	backMenu->addAction(actBackParams);
	backMenu->addAction(actionWarmUp);

	// 菜单选项
	QMenu* optimMenu = menuBar->addMenu(QStringLiteral("选项(&P)"));
	QAction *actTest = new QAction(QStringLiteral("测试(&J)"));
	QAction *actRun = new QAction(QStringLiteral("运行(&S)"));
	QAction *actOptim = new QAction(QStringLiteral("优化(&Y)"));
	connect(actTest, SIGNAL(triggered()), this, SLOT(on_actionTest_triggered()));
	connect(actRun, SIGNAL(triggered()), this, SLOT(on_actionRun_triggered()));
	connect(actOptim, SIGNAL(triggered()), this, SLOT(on_actionOptim_triggered()));
	optimMenu->addAction(actTest);
	optimMenu->addAction(actRun);
	optimMenu->addAction(actOptim);

	hlay->addWidget(menuBar);

	ui.wgtMenuBar->setLayout(hlay);
	ui.wgtMenuBar->setVisible(true);
}

您可以通过以下步骤自定义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。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值