ZBLOG

CustomTitleBar::CustomTitleBar(QWidget *parent) : QWidget(parent) { setAutoFillBackground(true); QPalette palette = this->palette(); palette.setColor(QPalette::Background, QColor(221, 222, 226)); // 设置背景色 setPalette(palette); ...

从你提供的代码来看,虽然你在 CustomTitleBar 的构造函数中设置了窗口标志为 Qt::FramelessWindowHint,这实际上是适用于顶级窗口(例如 QMainWindowQDialog)的。由于 CustomTitleBar 只是一个普通的 QWidget,而不是一个顶级窗口,因此这个标志并不会去掉它的边框。

如果想要真正去掉整个窗口的边框,并且使用自定义标题栏,你需要在主窗口或对话框中设置 Qt::FramelessWindowHint,而不是在标题栏类中。下面是一个示例,展示如何正确实现:

主窗口部分

#include <QApplication>
#include <QMainWindow>

class CustomTitleBar; // 前向声明

class MainWindow : public QMainWindow {
    Q_OBJECT
public:
    MainWindow() {
        setWindowFlags(Qt::FramelessWindowHint); // 设置无边框
        
        CustomTitleBar* titleBar = new CustomTitleBar(this);
        setMenuWidget(titleBar);  // 将自定义标题栏放入主窗口
        
        setCentralWidget(new QWidget()); // 创建中心部件
        resize(800, 600);
    }
};

int main(int argc, char *argv[]) {
    QApplication app(argc, argv);
    
    MainWindow window;
    window.show();

    return app.exec();
}

自定义标题栏部分

保持你的自定义标题栏代码不变,只需确保它只处理按钮和界面的布局,不再尝试控制窗体标志。

#include <QPushButton>
#include <QHBoxLayout>
#include <QPalette>

class CustomTitleBar : public QWidget {
public:
    CustomTitleBar(QWidget *parent) : QWidget(parent) {
        setAutoFillBackground(true);
        
        QPalette palette = this->palette();
        palette.setColor(QPalette::Background, QColor(221, 222, 226));
        setPalette(palette);

        QPushButton* closeButton = new QPushButton("X", this);
        QPushButton* maximizeButton = new QPushButton("□", this);
        QPushButton* minimizeButton = new QPushButton("_", this);

        connect(closeButton, &QPushButton::clicked, parent, &QWidget::close);

        connect(maximizeButton, &QPushButton::clicked, this, [=]() {
            if (auto window = qobject_cast<QMainWindow*>(parent)) {
                if (window->isMaximized()) {
                    window->showNormal();
                } else {
                    window->showMaximized();
                }
            }
        });

        connect(minimizeButton, &QPushButton::clicked, parent, &QWidget::showMinimized);

        QHBoxLayout* layout = new QHBoxLayout(this);
        layout->addStretch();  
        layout->addWidget(minimizeButton);
        layout->addWidget(maximizeButton);
        layout->addWidget(closeButton);
        
        setFixedHeight(40); 
    }
};

总结

  1. 确保将 setWindowFlags(Qt::FramelessWindowHint) 放在主窗口或对话框的构造函数中,而不是在自定义标题栏中。
  2. 使用自定义标题栏时,不要忘记在主窗口或对话框中添加功能,以便用户能够移动、最小化、最大化和关闭窗口。

通过这种方式,你应该能成功创建一个没有边框且带有自定义标题栏的窗体。


内容由零声教学AI助手提供,问题来源于学员提问

本站部分文章来源于网络,版权归原作者所有,如有侵权请联系站长删除。
转载请注明出处:https://sdn.0voice.com/?id=7692

分享:
扫描分享到社交APP
上一篇
下一篇
发表列表
游客 游客
此处应有掌声~
评论列表

还没有评论,快来说点什么吧~

联系我们

在线咨询: 点击这里给我发消息

微信号:3007537140

上班时间: 10:30-22:30

关注我们
x

注册

已经有帐号?