要去除Qt窗口的标题栏,可以使用以下代码:
setWindowFlags(Qt::FramelessWindowHint); // 去掉标题栏
这将设置窗口标志以指示该窗口没有边框和标题栏。但是,这也意味着您需要自己添加关闭、最小化和最大化按钮。
为此,您可以在窗口中添加自定义QWidget,并在其中放置QPushButton来实现所需的操作。 您还可以通过QMouseEvent处理程序实现拖动和调整大小功能。
下面是一个示例:
#include <QtWidgets>
class CustomWindow : public QWidget {
public:
CustomWindow(QWidget* parent = nullptr)
: QWidget(parent)
{
setWindowFlags(Qt::FramelessWindowHint); // 去掉标题栏
// 添加自定义QWidget作为标题栏,并设置背景色和布局
m_titleBar = new QWidget(this);
m_titleBar->setStyleSheet("background-color: #333;");
QHBoxLayout* titleLayout = new QHBoxLayout(m_titleBar);
// 添加关闭按钮并连接到槽函数
QPushButton* closeButton = new QPushButton("×", m_titleBar);
closeButton->setFixedSize(30, 30);
closeButton->setStyleSheet("color: white; background-color: #CC0000; border-radius: 15px;");
connect(closeButton, &QPushButton::clicked, this, &CustomWindow::close);
// 添加最小化按钮并连接到槽函数
QPushButton* minimizeButton = new QPushButton("-", m_titleBar);
minimizeButton->setFixedSize(30, 30);
minimizeButton->setStyleSheet("color: white; background-color: #333; border-radius: 15px;");
connect(minimizeButton, &QPushButton::clicked, this, &CustomWindow::showMinimized);
// 添加最大化/还原按钮并连接到槽函数
QPushButton* maximizeRestoreButton = new QPushButton("+", m_titleBar);
maximizeRestoreButton->setFixedSize(30, 30);
maximizeRestoreButton->setStyleSheet("color: white; background-color: #333; border-radius: 15px;");
connect(maximizeRestoreButton, &QPushButton::clicked, this, &CustomWindow::maximizeOrRestore);
// 将按钮添加到标题栏布局中
titleLayout->addWidget(closeButton);
titleLayout->addWidget(minimizeButton);
titleLayout->addWidget(maximizeRestoreButton);
}
protected:
void mousePressEvent(QMouseEvent* event) override {
if (event->button() == Qt::LeftButton) {
m_dragging = true;
m_dragPos = event->globalPos() - frameGeometry().topLeft();
event->accept();
}
}
void mouseMoveEvent(QMouseEvent* event) override {
if (m_dragging && (event->buttons() & Qt::LeftButton)) {
move(event->globalPos() - m_dragPos);
event->accept();
}
}
void mouseReleaseEvent(QMouseEvent* event) override {
if (event->button() == Qt::LeftButton)
m_dragging = false;
}
private slots:
void maximizeOrRestore() {
if (isMaximized()) {
showNormal();
m_maximized = false;
emit restored();
} else {
showMaximized();
m_maximized = true;
emit maximized();
}
}
private:
QWidget* m_titleBar = nullptr;
QPoint m_dragPos;
bool m_dragging = false;
bool m_maximized = false;
};
int main(int argc, char** argv) {
QApplication app(argc, argv);
CustomWindow window;
QLabel label("Hello World!");
QVBoxLayout* layout = new QVBoxLayout(&window);
layout->addWidget(window.titleBar()); // 添加自定义标题栏
layout->addWidget(&label); // 在窗口中添加标签
window.show();
return app.exec();
}
在上面的示例代码中,我们创建了一个名为CustomWindow的自定义QWidget类,并使用setWindowFlags()函数去除了Qt窗口的标题栏。然后,我们添加了一个自定义QWidget作为标题栏,并将关闭、最小化和最大化/还原按钮添加到布局中。我们还实现了鼠标事件处理程序以允许用户拖动窗口和调整大小。
在main()函数中,我们创建CustomWindow对象并在其中添加一个QLabel