相关文章推荐
霸气的骆驼  ·  vue element admin ...·  1 周前    · 
幸福的帽子  ·  ConnectionError: ...·  10 月前    · 
活泼的枕头  ·  delphi - How Can I ...·  1 年前    · 

# 重写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;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",在运行程序之前需要将图片文件放在合适的位置。