zoukankan      html  css  js  c++  java
  • QT 自定义模态对话框

    新建一个MsgBox类

    msgbox.h 代码

    #ifndef MSGBOX_H
    #define MSGBOX_H
    
    #include <QDialog>
    #include <QPushButton>
    #include <QLabel>
    #include <QMouseEvent>
    #include <QFont>
    #include <QPixmap>
    #include <QPainter>
    #include<QBitmap>
    
    class MsgBox : public QDialog
    {
        Q_OBJECT
    
    public:
        MsgBox(QWidget *parent = 0);
        ~MsgBox();
    
    public:
        QPushButton *ok_button;
        QPushButton *close_button;
        QPushButton *cancel_button;
        QLabel *ask_label;
        QLabel *msg_label;
        QLabel *title_label;
        QString ok_text;
        QString cancel_text;
    
    public:
        void setInfo(QString title_info, QString info,QPixmap pixmap, bool is_ok_hidden,QString language);
    protected:
        QPoint move_point;
        bool mouse_press;
    
        void paintEvent(QPaintEvent *);
        void mousePressEvent( QMouseEvent * event );
        void mouseReleaseEvent( QMouseEvent *);
        void mouseMoveEvent(QMouseEvent *event);
    public slots:
        void okOperate();
        void cancelOperate();
        void closeOperate();
    };
    
    #endif // MSGBOX_H

    msgbox.cpp 代码

    #include "msgbox.h"
    
    MsgBox::MsgBox(QWidget *parent)
        : QDialog(parent)
    {
          this->resize(320, 160);
    
          //获取主界面的宽度
          int width = this->width();
          int height = this->height();
    
          //初始化为未按下鼠标左键
          mouse_press = false;
    
          //设置标题栏隐藏
          this->setWindowFlags(Qt::FramelessWindowHint | Qt::Dialog);
    
          close_button = new QPushButton(this);
    
          //close_button->loadPixmap(":/image/images/bg.png");
          close_button->setGeometry(width-30,5, 20, 20);
          close_button->setStyleSheet("border-image:url(:/image/images/closeBtn.png);");
    
          //设置标题
          title_label = new QLabel(this);
          title_label->setObjectName(QString::fromUtf8("labelOne"));
          QFont font = title_label->font();
          font.setBold(true);
          title_label->setFont(font);
          title_label->setGeometry(0, 0, width-50, 30);
    
          //设置提示图片
          msg_label = new QLabel(this);
          msg_label->setGeometry(20, 50, 36, 36);
          msg_label->setScaledContents(true);
    
          //设置提示信息,让QLabel能够自动判断并换行显示:
          ask_label = new QLabel(this);
          ask_label->setGeometry(65, 60, width-50, 25*2);
          ask_label->setWordWrap(true);
          ask_label->setAlignment(Qt::AlignTop);
    
          cancel_button = new QPushButton(this);
          cancel_button->resize(70, 25);
          cancel_button->move(width - cancel_button->width() - 10, height - 35);
    
          ok_button = new QPushButton(this);
          ok_button->resize(70, 25);
          ok_button->move(width - ok_button->width() - cancel_button->width() - 20, height - 35);
    
    
          ok_button->setObjectName(QString::fromUtf8("pushButtonTwo"));
          cancel_button->setObjectName(QString::fromUtf8("pushButtonTwo"));
    
          QObject::connect(ok_button, SIGNAL(clicked()), this, SLOT(okOperate()));
          QObject::connect(close_button, SIGNAL(clicked()), this, SLOT(closeOperate()));
          QObject::connect(cancel_button, SIGNAL(clicked()), this, SLOT(cancelOperate()));
    }
    
    MsgBox::~MsgBox()
    {
    
    }
    
    //设置对话框信息
    void MsgBox::setInfo(QString title_info, QString info,QPixmap pixmap,bool is_ok_hidden,QString language)
    {
      title_label->setText(QString("  ") + title_info);
    
      //设置提示信息
      ask_label->setText(info);
      msg_label->setPixmap(pixmap);
    
      //是否隐藏确定按钮
      ok_button->setHidden(is_ok_hidden);
      if(is_ok_hidden)
      {
          if(language == "中文")
          {
              cancel_button->setText(tr("确定"));
          }
          else if(language == "英文")
          {
              cancel_button->setText(tr("OK"));
          }
          else if(language == "泰文")
          {
              cancel_button->setText(tr("แน่ใจว่า"));
          }
      }
      else
      {
          if(language == "中文")
          {
              ok_button->setText(tr("确定"));
              cancel_button->setText(tr("取消"));
          }
          else if(language == "英文")
          {
              ok_button->setText(tr("OK"));
              cancel_button->setText(tr("Cancel"));
          }
          else if(language == "泰文")
          {
              ok_button->setText(tr("แน่ใจว่า"));
              cancel_button->setText(tr("การยกเลิก"));
          }
      }
    
      //设置默认按钮为取消按钮
      cancel_button->setFocus();
    }
    
    void MsgBox::paintEvent(QPaintEvent *)
    {
      QPainter painter(this);
      painter.drawPixmap(rect(), QPixmap(":/image/images/close.png"));
    
      QBitmap bitmap(this->size());
      QPainter painter2(&bitmap);
      painter2.fillRect(bitmap.rect(), Qt::white);
      painter2.setBrush(QColor(0, 0, 0));
      painter2.drawRoundedRect(rect(), 4, 4);
      setMask(bitmap);
    }
    
    void MsgBox::mousePressEvent( QMouseEvent * event )
    {
      //只能是鼠标左键移动和改变大小
      if(event->button() == Qt::LeftButton)
      {
        mouse_press = true;
      }
    
      //窗口移动距离
      move_point = event->globalPos() - pos();
    }
    
    void MsgBox::mouseReleaseEvent( QMouseEvent *)
    {
      mouse_press = false;
    }
    
    void MsgBox::mouseMoveEvent(QMouseEvent *event)
    {
      //移动窗口
      if(mouse_press)
      {
        QPoint move_pos = event->globalPos();
        move(move_pos - move_point);
      }
    }
    
    //确认操作
    void MsgBox::okOperate()
    {
      this->accept();
    }
    
    //取消操作
    void MsgBox::cancelOperate()
    {
      this->reject();
    }
    
    //关闭窗体操作
    void MsgBox::closeOperate()
    {
        close();
    }

    主函数调用代码:

    #include "msgbox.h"
    #include <QApplication>
    
    int main(int argc, char *argv[])
    {
        QApplication a(argc, argv);
        MsgBox w;
    
        w.setInfo(QString("提示:"),QString("是否关机?"),QPixmap(":/image/images/tip.png"),false,QString("中文"));
        w.show();
        return a.exec();
    }

    目录构建图:

    实现效果图:

  • 相关阅读:
    xgqfrms™, xgqfrms® : xgqfrms's offical website of GitHub!
    xgqfrms™, xgqfrms® : xgqfrms's offical website of GitHub!
    详解以太坊世界状态
    VDF 不是工作量证明
    以太坊:Go-Ethereum: 编译运行
    【转】理解分布式账本技术: 经济学视角
    Counterfactual 项目:广义的以太坊状态通道
    Solidity 安全:已知攻击方法和常见防御模式综合列表
    Verge 攻击解析
    以太坊区块链的轻客户端
  • 原文地址:https://www.cnblogs.com/qiantao/p/9766552.html
Copyright © 2011-2022 走看看