QT开发中文网

Qt C++ 自定义QDialog标题栏

要在Qt C++中自定义QDialog的标题栏,你可以通过重写mousePressEventmouseMoveEventpaintEvent等事件来实现。以下是一个示例代码:

#include <QApplication>
#include <QDialog>
#include <QHBoxLayout>
#include <QLabel>
#include <QPushButton>

class CustomDialog : public QDialog {
public:
    explicit CustomDialog(QWidget* parent = nullptr) : QDialog(parent) {
        setWindowFlags(Qt::FramelessWindowHint); // 去除默认的窗口边框

        // 创建自定义标题栏部件
        titleBarWidget = new QWidget(this);
        titleBarWidget->setFixedHeight(30); // 设置标题栏高度
        titleBarWidget->setObjectName("TitleBar");

        // 标题栏布局
        QHBoxLayout* layout = new QHBoxLayout(titleBarWidget);
        layout->setContentsMargins(5, 0, 5, 0);

        QLabel* titleLabel = new QLabel("自定义标题", titleBarWidget);
        titleLabel->setStyleSheet("color: white; font-weight: bold;");

        QPushButton* closeButton = new QPushButton("×", titleBarWidget);
        closeButton->setFixedSize(20, 20);
        closeButton->setStyleSheet(
            "QPushButton { color: white; background-color: red; border-radius: 10px; }"
            "QPushButton:hover { background-color: darkred; }");
        
	closeButton->setAttribute(Qt::WA_StyledBackground);

	layout->addWidget(titleLabel);
	layout->addStretch();
	layout->addWidget(closeButton);

	// 添加自定义标题栏部件到对话框布局中
	QVBoxLayout* mainLayout = new QVBoxLayout(this);
	mainLayout->addWidget(titleBarWidget);

	// 其他内容
	QLabel* contentLabel = new QLabel("这是一个自定义标题栏的对话框", this);
	contentLabel->setAlignment(Qt::AlignCenter);
	mainLayout->addWidget(contentLabel);

	// 设置对话框布局
	setLayout(mainLayout);

	// 连接关闭按钮的点击事件,退出应用程序
	connect(closeButton, &QPushButton::clicked, qApp, &QApplication::quit);
    }

protected:
    void mousePressEvent(QMouseEvent* event) override {
        // 处理鼠标按下事件,用于实现拖动窗口功能
        if (event->button() == Qt::LeftButton) {
            isMousePressed = true;
            mousePressPos = event->pos();
        }
        QDialog::mousePressEvent(event);
    }

    void mouseMoveEvent(QMouseEvent* event) override {
        // 处理鼠标移动事件,用于实现拖动窗口功能
        if (isMousePressed && (event->buttons() & Qt::LeftButton)) {
            move(event->globalPos() - mousePressPos);
            event->accept();
        }
        QDialog::mouseMoveEvent(event);
    }

    void paintEvent(QPaintEvent* event) override {
        // 自定义绘制标题栏背景色
        QPainter painter(this);
	painter.fillRect(titleBarWidget->rect(), QColor(52, 73, 94)); // 设置标题栏颜色
	QDialog::paintEvent(event);
    }

private:
    bool isMousePressed = false;  // 记录鼠标是否按下状态
    QPoint mousePressPos;         // 鼠标按下时的位置

    QWidget* titleBarWidget;      // 标题栏部件
};

int main(int argc, char** argv) {
    QApplication app(argc, argv);

    CustomDialog dialog;
    dialog.show();

    return app.exec();
}

在这个示例中,我们创建了一个自定义的CustomDialog类来继承QDialog。我们重写了鼠标按下和移动事件来实现拖动窗口的功能,并且重写了绘制事件来自定义标题栏的背景色。

通过设置Qt::FramelessWindowHint标志,我们去除了默认的窗口边框。然后,我们创建了一个自定义的标题栏部件并将其添加到对话框布局中。你可以根据需要修改标题栏部件的样式和功能。

希望这个示例能够满足你的需求!


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

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

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

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

联系我们

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

微信号:3007537140

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

关注我们
x

注册

已经有帐号?