# 重写QDialog
# 删除Qt标题栏的问号,<坑>解决使用setWindowFlags(Qt::CustomizeWindowHint | Qt::WindowCloseButtonHint)闪退
# QPushButton的StyleSheet
# QPushButton上的鼠标样式,setCursor(Qt::PointingHandCursor)
pmeesagebox.h
#ifndef PMESSAGEBOX_H
#define PMESSAGEBOX_H
#include <QObject>
#include <QDialog>
#include <QLayout>
#include <QLabel>
#include <QPushButton>
/* PM_MODE 的取值 */
enum{
PM_DEFAULT_MODE = 0,
PM_ERROR_MODE = 1,
PM_CAUTION_MODE = 2
class PMessageBox : public QDialog
Q_OBJECT
public:
PMessageBox(QWidget *parent = nullptr,
int PM_MODE = PM_DEFAULT_MODE,
QString message = "no data");
private slots:
void positiveButtonClicked();
private:
int PM_MODE; // 显示方案的flag
QString message; //提示内容
/** StyleSheet **/
QString qmessagebox_style = "background:#FFFFFF";
QString message_label_style = "QLabel{font-size:12px;"
"font-family:微软雅黑;"
"color:#000000}";
QString positive_button_style = "QPushButton{font-size:12px;"
"font-family:微软雅黑;"
"color:#FFFFFF;"
"background:#638CF5;"
"border-radius:12px}"
"QPushButton:hover{"
"background:#4462A2}"
"QPushButton:press{"
"backroound:#4462A2}";
/** Functions **/
void initLayout();
void setMessageBox();
/** Layouts **/
QVBoxLayout *mainLayout; //整个PMessageBox的布局
QHBoxLayout *layout1; // 图标 + 提示信息的布局
QHBoxLayout *buttonsLayout; //按钮的布局
/** Widgets **/
QLabel *imageLabel, *messageLabel;
QPushButton *positiveButton;
#endif // PMESSAGEBOX_H
pmessagebox.cpp
#pragma execution_character_set("utf-8")
#include "pmessagebox.h"
PMessageBox::PMessageBox(QWidget *parent,
int PM_MODE,
QString message) : QDialog(parent){
this->PM_MODE = PM_MODE;
this->message = message;
initLayout(); //设置布局
setMessageBox(); //根据PM_MODE设置PMessageBox
//设置布局
void PMessageBox::initLayout(){
mainLayout = new QVBoxLayout;
layout1 = new QHBoxLayout;
buttonsLayout = new QHBoxLayout;
imageLabel = new QLabel;
imageLabel->setFixedSize(60, 60);
messageLabel = new QLabel;
messageLabel->setFixedSize(220, 60);
messageLabel->setStyleSheet(message_label_style);
messageLabel->setAlignment(Qt::AlignCenter);
messageLabel->setText(message);
layout1->addWidget(imageLabel);
layout1->addStretch();
layout1->addWidget(messageLabel);
positiveButton = new QPushButton;
positiveButton->setFixedSize(80, 25);
positiveButton->setText("确认");
positiveButton->setStyleSheet(positive_button_style);
positiveButton->setCursor(Qt::PointingHandCursor); //设置鼠标悬停样式
positiveButton->setFocus();
connect(positiveButton, SIGNAL(clicked()), SLOT(positiveButtonClicked()));
buttonsLayout->addStretch();
buttonsLayout->addWidget(positiveButton);
mainLayout->addLayout(layout1);
mainLayout->addLayout(buttonsLayout);
this->setLayout(mainLayout);
this->setFixedSize(300, 100);
// 仅保留关闭按钮
this->setWindowFlags(Qt::Dialog|
Qt::WindowCloseButtonHint);
this->setStyleSheet(qmessagebox_style);
//根据PM_MODE自定义显示
void PMessageBox::setMessageBox(){
QString window_title = "";
QString window_icon = "";
if(PM_MODE == PM_ERROR_MODE){
window_title = "错误";
window_icon = "THE ERROR IMAGE PATH";
else if(PM_MODE == PM_CAUTION_MODE){
window_title = "注意";
window_icon = "THE CAUTION IMAGE PATH";
else{
window_title = "未指定";
window_icon = "THE DEFAULT IMAGE PATH";
QImage qImage(window_icon);
qImage.scaled(60, 60, Qt::KeepAspectRatio);
imageLabel->setPixmap(QPixmap::fromImage(qImage));
this->setWindowTitle(window_title);
this->setWindowIcon(QIcon(window_icon));
//Positive(确认)按钮被点击 -> 直接关闭当前PMessageBox
void PMessageBox::positiveButtonClicked(){
this->close();
PMessageBox *messageBox = new PMessageBox(this,
PM_ERROR_MODE,
"数据库启动失败, \n请重试或联系管理员!");;
messageBox->setAttribute(Qt::WA_DeleteOnClose);
messageBox->exec();
# 重写QDialog# 删除Qt标题栏的问号,使用setWindowFlags(Qt::CustomizeWindowHint |Qt::WindowCloseButtonHint);# QPushButton的StyleSheet
Qt大佬:一去、二三里的自定义QMessageBox
上述链接的窗体继承于大神的自定义Widget,我这里稍作修改,继承于QDialog方便了使用,这里可以任意实现QMessageBox的样式而不受系统约束(例如标题栏)
自定义QMessageBox窗体结构示意:
2、头文件:
#ifndef MESSAGEBOX_H
#define MESSAGEBOX_H
#include &amp;amp;l...
通过前几节的自定义窗体的学习,我们可以很容易的写出一套属于自己风格的界面框架,通用于各种窗体,比如:QWidget、QDialog、QMainWindow。
大多数窗体的实现都是采用控件堆积来完成的,只要思路清晰,再复杂的界面实现起来都游刃有余。下面我来列举一个由QMessageBox扩展的提示框-根据其源码实现思路来实现!
在 Qt 中,可以使用 QLabel 来显示图片,QScrollArea 来实现图片的放大缩小,QDialog 或 QMainWindow 来作为弹出的窗口。
首先,在你的程序中创建一个 QDialog 或 QMainWindow 类的对象,并设置它的尺寸和标题。然后,在这个窗口中创建一个 QScrollArea 对象,并设置它的尺寸和位置。接着,在 QScrollArea 中创建一个 QLabel 对象,并使用 QLabel 的 setPixmap() 方法设置要显示的图片。最后,调用 QDialog 的 exec() 或 QMainWindow 的 show() 方法使窗口显示出来。
下面是一个简单的示例代码:
#include <QDialog>
#include <QLabel>
#include <QScrollArea>
#include <QPixmap>
int main(int argc, char *argv[])
QApplication app(argc, argv);
QDialog dialog;
dialog.setWindowTitle("放大局部图片");
dialog.resize(600, 400);
QScrollArea scrollArea;
scrollArea.setWidget(&dialog);
scrollArea.setGeometry(10, 10, 580, 380);
QLabel label;
QPixmap pixmap("image.png");
label.setPixmap(pixmap);
label.resize(pixmap.size());
scrollArea.setWidget(&label);
dialog.exec();
return app.exec();
在这个示例中,我们使用了 QDialog 类作为弹出窗口,并使用 QScrollArea 和 QLabel 来显示图片。图片的路径是 "image.png",在运行程序之前需要将图片文件放在合适的位置。