精华内容
下载资源
问答
  • Qt 自定义提示框

    2021-04-15 17:22:46
    } 调用举例: //退出提示框 if(m_msgBox){ delete m_msgBox; } m_msgBox=new MsgBox(3,QStringLiteral("正在试图结束程序"),this); if(m_msgBox->exec()==0) { event->ignore(); return; } // 警告框 if(m_msgBox){...

    新建 msgbox.h 文件,代码如下

    #ifndef MSGBOX_H
    #define MSGBOX_H
    
    #include <QPushButton>
    #include <QLabel>
    #include <QMouseEvent>
    #include<QDialog>
    #include<QTimer>
    #include<QDebug>
    #include <windows.h>
    #include <QWidget>
    class MsgBox : public QDialog
    {
        Q_OBJECT
    public:
        MsgBox(int style,QString text,QWidget *parent = 0);
        ~MsgBox();
    public:
        QPushButton *okBtn;
        QPushButton *cancleBtn;
        QPushButton *closeBtn;
        QPushButton * msgBtn;
        QLabel * titleLabel;
        QLabel *askLabel;
    
    protected:
        QPoint move_point;                                    //移动的距离
        bool mouse_press;                                    //鼠标按下
        void mousePressEvent(QMouseEvent *qevent);            //鼠标按下事件
        void mouseReleaseEvent(QMouseEvent *qevent);         //鼠标释放事件
        void mouseMoveEvent(QMouseEvent *qevent);             //鼠标移动事件
    
    public slots:
        void okBtn_press();
        void cancleBtn_press();
        void closeBtn_press();
        void closeWin();
    };
    #endif // MSGBOX_H
    

    创建msgbox.cpp 文件,代码如下

    #include "msgbox.h"
    
    MsgBox::MsgBox(int style, QString text, QWidget *parent):QDialog(parent)
    {
        this->resize(332,167);
      //获取主界面的宽度
        int width = this->width();
        int height = this->height();
        setStyleSheet("QWidget{background-color: rgb(219,229,245);}");
      //初始化为未按下鼠标左键
    
      //设置标题栏隐藏
        this->setWindowFlags(Qt::FramelessWindowHint | Qt::Dialog);
        titleLabel = new QLabel(this);
        titleLabel->setGeometry(0,0,width,30);
        if(style==1)
            titleLabel->setText(QStringLiteral("  警告  "));
        else
            titleLabel->setText(QStringLiteral("  提示  "));
        titleLabel->setStyleSheet("QLabel{font-family :微软雅黑;font-size : 5em;color : rgb(255,255,255);background-color: rgb(139,159,185); border-radius:0px;}");
    
        closeBtn = new QPushButton(this);
        closeBtn->setGeometry(width-30, 6, 20, 20);
        closeBtn->setStyleSheet("QPushButton{image:url(:/images/images/close.png);background: transparent;border:none;}QPushButton:hover{image:url(:/images/images/closeHover.png);background: transparent;border:none;}");
    
        msgBtn = new QPushButton(this);
        msgBtn->setGeometry(25,56,44,44);
        if(style == 1)      //警告
            msgBtn->setStyleSheet("QPushButton{image:url(:/images/images/warning.png);background: transparent;border:none;}");
        else if(style == 2)  //提示
            msgBtn->setStyleSheet("QPushButton{image:url(:/images/images/information.png);background: transparent;border:none;}");
        else if(style == 3)  //询问
            msgBtn->setStyleSheet("QPushButton{image:url(:/images/images/question.png);background: transparent;border:none;}");
        else if(style == 4)  //错误
            msgBtn->setStyleSheet("QPushButton{image:url(:/images/images/error.png);background: transparent;border:none;}");
    
        askLabel = new QLabel(this);
        askLabel->setGeometry(95,52,width,50);
        askLabel->setText(text);
        askLabel->setStyleSheet("QLabel{font-family :微软雅黑;font-size:20px;}");
    
        okBtn=new QPushButton(this);
        if(style==3)
            okBtn->setGeometry(90,119,85,30);
        else
            okBtn->setGeometry(135,119,85,30);
    
        okBtn->setText(QStringLiteral("确定"));
        okBtn->setStyleSheet("QPushButton{border:1px groove gray;border-radius:4px;border-color: rgb(139,159,185);}QPushButton:hover{border-radius:4px;background-color: rgb(119,146,183);}QPushButton:pressed{border-radius:4px;background-color: rgb(139,159,185);}");
    
        cancleBtn=new QPushButton(this);
        cancleBtn->setGeometry(187,119,85,30);
        cancleBtn->setText(QStringLiteral("取消"));
        cancleBtn->setStyleSheet("QPushButton{border:1px groove gray;border-radius:4px;border-color: rgb(139,159,185);}QPushButton:hover{border-radius:4px;background-color: rgb(119,146,183);}QPushButton:pressed{border-radius:4px;background-color: rgb(139,159,185);}");
        if(style == 3)
            cancleBtn->show();
        else
            cancleBtn->hide();
    
        connect(okBtn,SIGNAL(clicked()),this,SLOT(okBtn_press()));
        connect(closeBtn,SIGNAL(clicked()),this,SLOT(closeBtn_press()));
        connect(cancleBtn,SIGNAL(clicked()),this,SLOT(cancleBtn_press()));
    
    }
    MsgBox::~MsgBox()
    {
        delete okBtn;
        delete cancleBtn;
        delete closeBtn;
        delete msgBtn;
        delete titleLabel;
        delete askLabel;
    }
    
    void MsgBox::mousePressEvent(QMouseEvent *qevent)
    {
        if(qevent->button() == Qt::LeftButton)
        {
            mouse_press = true;
            //鼠标相对于窗体的位置(或者使用event->globalPos() - this->pos())
            move_point = qevent->pos();;
        }
    }
    void MsgBox::mouseMoveEvent(QMouseEvent *qevent)
    {
        //若鼠标左键被按下
        if(mouse_press)
        {
            //鼠标相对于屏幕的位置
            QPoint move_pos = qevent->globalPos();
            //移动主窗体位置
            this->move(move_pos - move_point);
        }
    }
    void MsgBox::mouseReleaseEvent(QMouseEvent *qevent)
    {
        //设置鼠标为未被按下
        mouse_press = false;
    }
    
    void MsgBox::okBtn_press()
    {
        this->accept();
    }
    void MsgBox::cancleBtn_press()
    {
        this->reject();
    }
    void MsgBox::closeBtn_press()
    {
        close();
    }
    

    调用举例:

    //退出提示框
        if(m_msgBox){
            delete m_msgBox;
        }
        m_msgBox=new MsgBox(3,QStringLiteral("正在试图结束程序"),this);
        if(m_msgBox->exec()==0)
        {
            event->ignore();
            return;
        }
    // 警告框
        if(m_msgBox){
             delete m_msgBox;
         }
         m_msgBox=new MsgBox(1,QStringLiteral("请选择固件文件"),this);
         m_msgBox->exec();
    

    在这里插入图片描述
    在这里插入图片描述

    图标资源:

    链接:https://pan.baidu.com/s/1BIaY5k394nxavn9BRfWLUQ
    提取码:mlfg

    展开全文
  • 该资源参考“朝十晚八”,实现自定义检索,动态添加提示列表数据
  • Qt自定义提示框(类似QMessageBox)

    千次阅读 2017-07-04 14:44:09
    自定义提示框   qmessagebox   qt自定义qmessagebox   it 分类: Qt  Qt中经常会用到提示框,用于交互操作!QMessageBox是被大多数人用到的,用起来是很方便,但是控件类型、...
     (2013-06-07 17:38:05)
    标签: 

    qt

     

    自定义提示框

     

    qmessagebox

     

    qt自定义qmessagebox

     

    it

    分类: Qt

        Qt中经常会用到提示框,用于交互操作!QMessageBox是被大多数人用到的,用起来是很方便,但是控件类型、大小、布局、样式、往往不是开发者想要的,如果使用一套不经过样式处理的界面交给用户,那么结果可想而知。。。

        简单举个例子吧!

        QMessageBox::information(NULL, QString("title"), QString("I am information"));

    效果:

       

    Qt之自定义提示框(类似QMessageBox)


        关于QMessageBox的应用不再多提!因为主要说明的是自定义提示框。。。

        以下是自定义提示框的代码,有图有真相!提示框大部分都采用模态的形式,关于模态也不再多提!所以父类为QDialog,通过exec()返回值QDialog::Accepted或QDialog::Rejected来进行判断执行相应的事件。

     

    #include "msg_box.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 PushButton(this);
      close_button->loadPixmap("tipclose");
      close_button->setGeometry(width-30, 0, 30, 30); 
     
      //设置标题
      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-100, 25*2);
      ask_label->setWordWrap(true);
      ask_label->setAlignment(Qt::AlignTop);
     
      check_box = new QCheckBox(this);
      check_box->setGeometry(10, height - 35, 160, 25);
      check_box->setHidden(true);

      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);

      check_box->setStyleSheet("background:transparent;");

      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(cancelOperate()));
      QObject::connect(cancel_button, SIGNAL(clicked()), this, SLOT(cancelOperate()));

      this->translateLanguage();
    }

    void MsgBox::translateLanguage()
    {
      close_button->setToolTip(tr("close"));
      check_box->setText(tr("remember"));
      ok_text = tr("ok");
      cancel_text = tr("cancel");
    }

    void MsgBox::setInfo(QString title_info, QString info, QPixmap pixmap, bool is_check_hidden, bool is_ok_hidden)
    {
      title_label->setText(QString("  ") + title_info);

      //设置提示信息
      ask_label->setText(info);
      msg_label->setPixmap(pixmap);

      //是否隐藏复选框
      check_box->setChecked(false);
      check_box->setHidden(is_check_hidden);

      //是否隐藏确定按钮
      ok_button->setHidden(is_ok_hidden);
      if(is_ok_hidden)
      {
        cancel_button->setText(ok_text);
      }
      else
      {
        ok_button->setText(ok_text);
        cancel_button->setText(cancel_text);
      }

      //设置默认按钮为取消按钮
      cancel_button->setFocus();
    }

    void MsgBox::paintEvent(QPaintEvent *)
    {
      QPainter painter(this);
      painter.drawPixmap(rect(), QPixmap(":/icon/tip"));

      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()
    {
      bool is_hidden = check_box->isHidden();
      if(!is_hidden)
      {
        bool is_checked = check_box->isChecked();
        emit msgChecked(is_checked, true);
      }
      this->accept();
    }

    void MsgBox::cancelOperate()
    {
      bool is_check_hidden = check_box->isHidden();
      bool is_ok_hidden = ok_button->isHidden();
      if(!is_check_hidden)
      {
        bool is_checked = check_box->isChecked();
        if(!is_ok_hidden)
        {
          emit msgChecked(is_checked, false);
        }
       else
       {
         emit okMessageHidden(is_checked);
       } 
      }

      this->reject();
    }

     

    效果图:

    MsgBox *msg_box = new MsgBox();
     msg_box->setInfo(QString("文件删除"), QString("确实要把文件放入回收站吗?"), QPixmap(":/icon/attention"), true, false);
     msg_box->exec();

     

    Qt之自定义提示框(类似QMessageBox)

     MsgBox *msg_box2 = new MsgBox();
     msg_box2->setInfo(QString("重命名"), QString("文件名不能包含下列任何字符:\n     \\ / : * ? \" < > |"), QPixmap(":/icon/attention"), true, true);
     msg_box2->exec();

    Qt之自定义提示框(类似QMessageBox)

     MsgBox *msg_box3 = new MsgBox();
     msg_box3->setInfo(QString("批量文件删除"), QString("确实要把所有文件放入回收站吗?"), QPixmap(":/icon/attention"), false, false);
     msg_box3->exec();

    Qt之自定义提示框(类似QMessageBox)

     

        界面样式林林总总,只有想不到的,没有做不到的!实现方式也不尽相同,界面样式可以通过图片设计,也可以通过Qt样式自行实现,不同的人可以想象出维纳斯双臂的各种美的姿势。所以,具体实现细节还得由设计者根据实际情况来定!

    展开全文
  • 1.单选项提示框 2.双选项提示框 3.滚动选项提示框 4.多组合选项提示框 5.密码提示框 二、环境 qt57 window10 三、正文 画布多少,直接说核心部分 1.单选项提示框 背景是哥图片,可以自定义为任何不...

    一、前言

    用惯了自带的messagebox,或者感觉效果不是很好看,或者有界面的特殊美观需求等等,那么就定制吧。

    1.单选项提示框

    2.双选项提示框

    3.滚动选项提示框

    4.密码提示框

    5.多组合选项提示框1

    6.多组合选项提示框2

    7.多组合选项提示框3

    二、环境

    qt57

    window10

    三、正文

    画布多少,直接说核心部分

    1.单选项提示框

    背景是哥图片,可以自定义为任何不规则图片,然后传输想要显示的文本通过槽函数发送信号,新建一个widget用于显示,打开之后再初始化中加入定时器自动关闭界面,避免长时间没操作。

    messagebox1.h

    protected:
        void paintEvent(QPaintEvent *paintevent);
    private slots:
        void on_pushButton_clicked();
        void receivetext(QString res);
    private:
        Ui::MessageBox1 *ui;
        QPixmap pic;
    

    messagebox1.cpp

    #include "messagebox1.h"
    #include "ui_messagebox1.h"
    
    MessageBox1::MessageBox1(QWidget *parent) :
        QDialog(parent),
        ui(new Ui::MessageBox1)
    {
        ui->setupUi(this);
        this->setWindowModality(Qt::ApplicationModal);//设置一直保持在顶端,不可切换其他界面,除非被新界面带此属性覆盖
        this->setWindowFlags(Qt::FramelessWindowHint);//设置窗体无边框
        this->setAttribute(Qt::WA_TranslucentBackground);//设置背景透明
        pic.load(tr(":/PIC/background/message1.png"));//设置背景
        //倒计时关闭界面
        for(int i=0;i<10;i++)
            QTimer::singleShot(i*1000,this,[=](){ui->pushButton->setText(QString("确认(%1)").arg(9-i));});
        QTimer::singleShot(10*1000,this,[=](){this->close();});
        ui->pushButton->setFocus();//设置聚焦,作用你懂的
    }
    MessageBox1::~MessageBox1()
    {
        delete ui;
    }
    void MessageBox1::paintEvent(QPaintEvent *paintevent)
    {
        paintevent->ignore();
        QPainter painter(this);
        painter.drawPixmap(0, 0, pic);//绘制图像
    }
    void MessageBox1::on_pushButton_clicked()
    {
        this->close();
    }
    void MessageBox1::receivetext(QString res)
    {
        ui->label->setText(res);
    }
    

    ui中加入button和label即可

    主函数调用

        MessageBox1 * box = new MessageBox1();
        box->show();
        box->setAttribute(Qt::WA_DeleteOnClose);//若是关闭界面,则彻底释放资源
        connect(this,SIGNAL(sendtext(QString)),box,SLOT(receivetext(QString)));
        emit sendtext("提示!\r\n这是一个测试消息!");

    2.双选项提示框

    参考上面的,核心部分就是观测exec返回值0或1,代表是否点击确认,还是点击取消,还是强制或者自动关闭的提示框界面, 默认确认为1,其余为0

    在初始化里加入this->reject();//exec返回值为0

    在确认按键点击之后加入this->accept();//exec返回值为1

    主函数调用

        MessageBox2 * box = new MessageBox2();
        box->show();
        box->setAttribute(Qt::WA_DeleteOnClose);//若是关闭界面,则彻底释放资源
        connect(this,SIGNAL(sendtext(QString)),box,SLOT(receivetext(QString)));
        emit sendtext("提示!\r\n这是一个测试消息!");
        qDebug()<<box->exec();

    这里的判断box->exec()返回值就和正常的messagebox使用判断一样了

    3.滚动选项提示框

    主要就是把第2个的label换成了一个自定义控件,自定义控件的功能是滚动选择,然后绑定一些槽配套使用再传递给主函数即可

    messagebox3.h

    #ifndef MESSAGEBOX3_H
    #define MESSAGEBOX3_H
    #include <QDialog>
    #include "common.h"
    #include "CustomWidget/Slidingselector/slidingselector.h"
    namespace Ui {
    class MessageBox3;
    }
    class MessageBox3 : public QDialog
    {
        Q_OBJECT
    public:
        explicit MessageBox3(QWidget *parent = 0);
        ~MessageBox3();
    protected:
        void paintEvent(QPaintEvent *paintevent);
    signals:
        void sendchoose(QString);
    private slots:
        void on_btn_sure_clicked();
        void on_btn_false_clicked();
        void receivetext(QStringList res,int num);
    private:
        Ui::MessageBox3 *ui;
        QPixmap pic;
        QStringList m_strlist;//所有滚动项列表
        SlidingSelector *roll;
        QString choose;
    };
    #endif // MESSAGEBOX1_H
    

    messagebox3.cpp

    #include "messagebox3.h"
    #include "ui_messagebox3.h"
    
    MessageBox3::MessageBox3(QWidget *parent) :
        QDialog(parent),
        ui(new Ui::MessageBox3)
    {
        ui->setupUi(this);
        this->setWindowModality(Qt::ApplicationModal);//设置一直保持在顶端,不可切换其他界面,除非被新界面带此属性覆盖
        this->setWindowFlags(Qt::FramelessWindowHint);//设置窗体无边框
        this->setAttribute(Qt::WA_TranslucentBackground);//设置背景透明
        pic.load(tr(":/PIC/background/message2.png"));//设置背景
    
        roll=new SlidingSelector;
        roll->show();
        ui->horizontalLayout->addWidget(roll);
        roll->setMode_Hor_Ver(Vertical);//设置垂直模式
        roll->setMode_Num_Str(String);//设置字符串模式
        connect(roll,&SlidingSelector::currentStrChanged,[=](QString aaa){
            choose=aaa;
            //qDebug()<<aaa;
        });
    
        //倒计时关闭界面
        for(int i=0;i<30;i++)
            QTimer::singleShot(i*1000,this,[=](){ui->btn_false->setText(QString("取消(%1)").arg(29-i));});
        QTimer::singleShot(30*1000,this,[=](){this->close();});
        ui->btn_false->setFocus();//设置聚焦,作用你懂的
    }
    MessageBox3::~MessageBox3()
    {
        delete ui;
    }
    void MessageBox3::paintEvent(QPaintEvent *paintevent)
    {
        paintevent->ignore();
        QPainter painter(this);
        painter.drawPixmap(0, 0, pic);//绘制图像
    }
    void MessageBox3::on_btn_sure_clicked()
    {
        emit sendchoose(choose);
        this->close();
    }
    void MessageBox3::on_btn_false_clicked()
    { 
        this->close();
    }
    void MessageBox3::receivetext(QStringList res,int num)
    {
        m_strlist=res;//m_strlist备用
        roll->setRange(res);
        choose=res.at(num);//设置当前值,避免直接不改变直接确认返回值无效
        roll->setCurrentStr(choose);
        //qDebug()<<res;
    }
    

    slidingselector自定义控件下载

    ui中将label改为horizontalLayout即可

    主函数调用

        MessageBox3 * box = new MessageBox3();
        box->show();
        box->setAttribute(Qt::WA_DeleteOnClose);//若是关闭界面,则彻底释放资源
        connect(this,SIGNAL(sendtext(QStringList,int)),box,SLOT(receivetext(QStringList,int)));
        QStringList list;
        list<<"str撒撒发生111"<<"str撒撒发生22"<<"str撒撒发生33"<<"str撒撒发生44"<<"str撒撒发生55"<<"str撒撒发生66";
        emit sendtext(list,2);
        connect(box,&MessageBox3::sendchoose,[=](QString res){
            qDebug()<<res;
        });

    滚动自定义控件简介,可设置为横向或者竖着刷新模式,可设置为数字或者字符串刷新模式,数字模式传入范围值即可,字符串模式传入参数QSteingList即可,可以把目前列表中的值传入让其显示。所有部分颜色均可更改

    4.密码提示框

    入口函数:

            MessageBox4 * box = new MessageBox4();
            box->show();
            box->setAttribute(Qt::WA_DeleteOnClose);//若是关闭界面,则彻底释放资源
            connect(this,SIGNAL(sendtext(QString)),box,SLOT(receivetext(QString)));
            emit sendtext("sy1234");
            qDebug()<<box->exec();

    核心代码

    //振动效果
    void MessageBox4::widgetShake(QWidget *pWidget, int nRange)
    {
        int nX = pWidget->x();
        int nY = pWidget->y();
        QPropertyAnimation *pAnimation = new QPropertyAnimation(pWidget,"geometry");
        pAnimation->setEasingCurve(QEasingCurve::InOutSine);
        pAnimation->setDuration(300);
        pAnimation->setStartValue(QRect(QPoint(nX,nY),pWidget->size()));
    
        int nShakeCount = 20; //抖动次数
        double nStep = 1.0/nShakeCount;
        for(int i = 1; i < nShakeCount; i++){
            nRange = i&1 ? -nRange : nRange;
            pAnimation->setKeyValueAt(nStep*i,QRect(QPoint(nX + nRange,nY),pWidget->size()));
        }
    
        pAnimation->setEndValue(QRect(QPoint(nX,nY),pWidget->size()));
        pAnimation->start(QAbstractAnimation::DeleteWhenStopped);
    }
    //打开屏幕键盘
    void MessageBox4::on_pushButton_keyboard_clicked()
    {
        //The code from david!!!
        PVOID OldValue;
        BOOL bRet = Wow64DisableWow64FsRedirection (&OldValue);
        QString csProcess="C:\\Windows\\System32\\osk.exe";
        QString params="";
        ShellExecute(NULL, L"open", (LPCWSTR)csProcess.utf16(), (LPCWSTR)params.utf16(), NULL, SW_SHOWNORMAL);
        if ( bRet )
        {
            Wow64RevertWow64FsRedirection(OldValue);
        }
        ui->lineEdit->setFocus();
    }
    void MessageBox4::closeEvent(QCloseEvent *event)
    {
        HWND appWnd;
        appWnd = ::FindWindow(L"OSKMainClass", NULL);
        if (appWnd){
           SendMessage(appWnd, WM_SYSCOMMAND, SC_CLOSE, 0);
           //qDebug() << "closeKeyboard succeed";
        }
        else{
           //qDebug() << "closeKeyboard failed";
         }
    }

    使用原理。传出进入密码,点击确定之后会判断面膜是否正确,若密码正确,则返回exec值为1,若不正确,会提示密码错误

     演示效果 :

    5.多组合选项提示框1

    入口函数:

            MessageBox5 * box = new MessageBox5();
            box->show();
            box->setAttribute(Qt::WA_DeleteOnClose);//若是关闭界面,则彻底释放资源
            connect(this,SIGNAL(sendtext(QStringList,QStringList)),box,SLOT(receivetext(QStringList,QStringList)));
            QStringList list1,list2;
            list1<<"str撒撒发生111"<<"str撒撒发生22"<<"str撒撒发生33"<<"str撒撒发生44"<<"str撒撒发生55"<<"str撒撒发生66";
            list2<<"aa"<<"bb";
            emit sendtext(list2,list1);
            connect(box,&MessageBox5::sendchoose,[=](QString res1,QString res2,QDate t1,QDate t2){
                qDebug()<<res1<<res2<<t1<<t2;
            });

    核心代码

     

    MessageBox5::MessageBox5(QWidget *parent) :
        QDialog(parent),
        ui(new Ui::MessageBox5)
    {
        ui->setupUi(this);
        this->setWindowModality(Qt::ApplicationModal);//设置一直保持在顶端,不可切换其他界面,除非被新界面带此属性覆盖
        this->setWindowFlags(Qt::FramelessWindowHint);//设置窗体无边框
        this->setAttribute(Qt::WA_TranslucentBackground);//设置背景透明
        pic.load(tr(":/PIC/background/message3.png"));//设置背景
    
        ui->stackedWidget->setCurrentIndex(0);//初始在第一个选项界面选择
        QPushButton *groupbtn[4]={ui->btn_sure_8,ui->btn_sure_9,ui->btn_sure_10,ui->btn_sure_11};
        for(int i=0;i<4;i++)//切换选项按键
            connect(groupbtn[i],&QPushButton::clicked,[=](){
                ui->stackedWidget->setCurrentIndex(i);
                groupbtn[i]->setChecked(true);
            });
    
        //设备属性选择
        roll1=new SlidingSelector;
        roll1->show();
        ui->horizontalLayout->addWidget(roll1);
        roll1->setMode_Hor_Ver(Vertical);//设置垂直模式
        roll1->setMode_Num_Str(String);//设置字符串模式
        roll1->setMode_One_Ext(OneList);//设置单列模式
        connect(roll1,&SlidingSelector::currentStrChanged,[=](QString aaa){
            choose1=aaa;
            ui->btn_sure_8->setText(choose1);
            //qDebug()<<aaa;
        });
        //部件属性选择
        roll2=new SlidingSelector;
        roll2->show();
        ui->horizontalLayout_2->addWidget(roll2);
        roll2->setMode_Hor_Ver(Vertical);//设置垂直模式
        roll2->setMode_Num_Str(String);//设置字符串模式
        roll2->setMode_One_Ext(OneList);//设置单列模式
        connect(roll2,&SlidingSelector::currentStrChanged,[=](QString aaa){
            choose2=aaa;
            ui->btn_sure_9->setText(choose2);
            //qDebug()<<aaa;
        });
        //起始时间选择
        for(int i=0;i<3;i++){
            rolltime1[i]=new SlidingSelector;
            rolltime1[i]->show();
            rolltime1[i]->setMinimumSize(100,250);//设置控件的最小尺寸
            ui->gridLayout->addWidget(rolltime1[i],0,i,1,1,Qt::AlignHCenter|Qt::AlignVCenter);
            rolltime1[i]->setMode_Hor_Ver(Vertical);//设置垂直模式
            rolltime1[i]->setMode_Num_Str(Number);//设置字符串模式
            rolltime1[i]->setMode_One_Ext(OneList);//设置单列模式
            connect(rolltime1[i],&SlidingSelector::currentValueChanged,[=](int aaa){
                if(i==0){
                    QDate tt;
                    tt.setDate(aaa,time1.month(),1);
                    rolltime1[2]->setRange(1,tt.daysInMonth());
                    if(time1.day()>tt.daysInMonth())
                        time1.setDate(aaa,time1.month(),tt.daysInMonth());
                    else
                        time1.setDate(aaa,time1.month(),time1.day());
                    rolltime1[2]->setCurrentNum(time1.day());
                }
                else if(i==1){
                    QDate tt;
                    tt.setDate(time1.year(),aaa,1);
                    rolltime1[2]->setRange(1,tt.daysInMonth());
                    if(time1.day()>tt.daysInMonth())
                        time1.setDate(time1.year(),aaa,tt.daysInMonth());
                    else
                        time1.setDate(time1.year(),aaa,time1.day());
                    rolltime1[2]->setCurrentNum(time1.day());
                }
                else{
                    time1.setDate(time1.year(),time1.month(),aaa);
                }
                //qDebug()<<aaa;
                ui->btn_sure_10->setText(time1.toString("yyyy-MM-dd"));//刷新显示界面
            });
        }
        //截止时间选择
        for(int i=0;i<3;i++){
            rolltime2[i]=new SlidingSelector;
            rolltime2[i]->show();
            rolltime2[i]->setMinimumSize(100,250);//设置控件的最小尺寸
            ui->gridLayout_2->addWidget(rolltime2[i],0,i,1,1,Qt::AlignHCenter|Qt::AlignVCenter);
            rolltime2[i]->setMode_Hor_Ver(Vertical);//设置垂直模式
            rolltime2[i]->setMode_Num_Str(Number);//设置字符串模式
            rolltime2[i]->setMode_One_Ext(OneList);//设置单列模式
            connect(rolltime2[i],&SlidingSelector::currentValueChanged,[=](int aaa){
                if(i==0){
                    QDate tt;
                    tt.setDate(aaa,time2.month(),1);
                    rolltime2[2]->setRange(1,tt.daysInMonth());
                    if(time2.day()>tt.daysInMonth())
                        time2.setDate(aaa,time2.month(),tt.daysInMonth());
                    else
                        time2.setDate(aaa,time2.month(),time2.day());
                    rolltime2[2]->setCurrentNum(time2.day());
                }
                else if(i==1){
                    QDate tt;
                    tt.setDate(time2.year(),aaa,1);
                    rolltime2[2]->setRange(1,tt.daysInMonth());
                    if(time2.day()>tt.daysInMonth())
                        time2.setDate(time2.year(),aaa,tt.daysInMonth());
                    else
                        time2.setDate(time2.year(),aaa,time2.day());
                    rolltime2[2]->setCurrentNum(time2.day());
                }
                else{
                    time2.setDate(time2.year(),time2.month(),aaa);
                }
                //qDebug()<<aaa;
                ui->btn_sure_11->setText(time2.toString("yyyy-MM-dd"));//刷新显示界面
            });
        }
    
    
    
    
        //倒计时关闭界面
        for(int i=0;i<60;i++)
            QTimer::singleShot(i*1000,this,[=](){ui->btn_false->setText(QString("取消(%1)").arg(59-i));});
        QTimer::singleShot(60*1000,this,[=](){this->close();});
        ui->btn_false->setFocus();//设置聚焦,作用你懂的
    }
    MessageBox5::~MessageBox5()
    {
        delete ui;
    }
    //重绘背景
    void MessageBox5::paintEvent(QPaintEvent *paintevent)
    {
        paintevent->ignore();
        QPainter painter(this);
        painter.drawPixmap(0, 0, pic);//绘制图像
    }
    //确认按键
    void MessageBox5::on_btn_sure_clicked()
    {
        emit sendchoose(choose1,choose2,time1,time2);
        this->close();
    }
    //取消按键
    void MessageBox5::on_btn_false_clicked()
    { 
        this->close();
    }
    //传入参数范围
    void MessageBox5::receivetext(QStringList res1,QStringList res2)
    {
        m_strlist1=res1;//m_strlist1备用
        roll1->setRange(res1); 
        choose1=res1.at(0);//设置当前值,避免直接不改变直接确认返回值无效
        roll1->setCurrentStr(choose1);
        ui->btn_sure_8->setText(choose1);//刷新显示界面
        //qDebug()<<res1;
        m_strlist2=res2;//m_strlist2备用
        roll2->setRange(res2);
        choose2=res2.at(0);//设置当前值,避免直接不改变直接确认返回值无效
        roll2->setCurrentStr(choose2);
        ui->btn_sure_9->setText(choose2);//刷新显示界面
        //qDebug()<<res2;
        time1=QDate::currentDate().addMonths(-1);//起始时间设置为上个月
        rolltime1[0]->setRange(1970,2070);
        rolltime1[1]->setRange(1,12);
        rolltime1[2]->setRange(1,time1.daysInMonth());
        rolltime1[0]->setCurrentNum(time1.year());
        rolltime1[1]->setCurrentNum(time1.month());
        rolltime1[2]->setCurrentNum(time1.day());
        ui->btn_sure_10->setText(time1.toString("yyyy-MM-dd"));//刷新显示界面
        //qDebug()<<time1.daysInMonth()<<time1.year()<<time1.month()<<time1.day();
        time2=QDate::currentDate();//截止时间设置为今天
        rolltime2[0]->setRange(1970,2070);
        rolltime2[1]->setRange(1,12);
        rolltime2[2]->setRange(1,time2.daysInMonth());
        rolltime2[0]->setCurrentNum(time2.year());
        rolltime2[1]->setCurrentNum(time2.month());
        rolltime2[2]->setCurrentNum(time2.day());
        ui->btn_sure_11->setText(time2.toString("yyyy-MM-dd"));//刷新显示界面
        //qDebug()<<time2.daysInMonth()<<time2.year()<<time2.month()<<time2.day();
    }

    原理:就是采用多个滑动选择器组合,配合一些逻辑,时间的改变逻辑占用一些代码行,在年份和月份改变时,日期对应的上限要跟着改变

    演示效果:

    6.多组合选项提示框2

    入口函数

            MessageBox6 * box = new MessageBox6();
            box->show();
            box->setAttribute(Qt::WA_DeleteOnClose);//若是关闭界面,则彻底释放资源
            connect(this,SIGNAL(sendtext(QStringList)),box,SLOT(receivetext(QStringList)));
            QStringList list1;
            list1<<"str撒生111"<<"str撒生22"<<"str发生33"<<"st撒发生44"<<"str发生55"<<"s撒发生66";
            emit sendtext(list1);
            connect(box,&MessageBox6::sendchoose,[=](QString res1,QDate t1,QDate t2){
                qDebug()<<res1<<t1<<t2;
            });

    核心代码同上,删除一项即可 

     

    7.多组合选项提示框3

    入口函数

            MessageBox7 * box = new MessageBox7();
            box->show();
            box->setAttribute(Qt::WA_DeleteOnClose);//若是关闭界面,则彻底释放资源
            connect(this,SIGNAL(sendtext(QString,QString,QString,QString,QStringList)),box,SLOT(receivetext(QString,QString,QString,QString,QStringList)));
            QStringList list2;
            list2<<"aa"<<"bb";
            //emit sendtext("","","","",list2);
            emit sendtext("bb","22","333","4444",list2);
            connect(box,&MessageBox7::sendtext,[=](QString res1,QString res2,QString res3,QString res4){
                qDebug()<<res1<<res2<<res3<<res4;
            });

    核心代码:

    #include "messagebox7.h"
    #include "ui_messagebox7.h"
    
    MessageBox7::MessageBox7(QWidget *parent) :
        QDialog(parent),
        ui(new Ui::MessageBox7)
    {
        ui->setupUi(this);
        this->setWindowModality(Qt::ApplicationModal);//设置一直保持在顶端,不可切换其他界面,除非被新界面带此属性覆盖
        this->setWindowFlags(Qt::FramelessWindowHint);//设置窗体无边框
        this->setAttribute(Qt::WA_TranslucentBackground);//设置背景透明
        pic.load(tr(":/PIC/background/message5.png"));//设置背景
        //倒计时关闭界面
        for(int i=0;i<60;i++)
            QTimer::singleShot(i*1000,this,[=](){ui->btn_false->setText(QString("取消(%1)").arg(59-i));});
        QTimer::singleShot(60*1000,this,[=](){this->close();});
        ui->btn_false->setFocus();//设置聚焦,作用你懂的
    }
    MessageBox7::~MessageBox7()
    {
        delete ui;
    }
    void MessageBox7::paintEvent(QPaintEvent *paintevent)
    {
        paintevent->ignore();
        QPainter painter(this);
        painter.drawPixmap(0, 0, pic);//绘制图像
    }
    void MessageBox7::on_btn_sure_clicked()
    {
        if(ui->lineEdit_1->text().isEmpty()){
            ui->label_5->setText("不能为空");
            widgetShake(ui->label_5,5);
            ui->lineEdit_1->setFocus();
            return;
        }
        else if(m_hascode.contains(ui->lineEdit_1->text())){
            ui->label_5->setText("账号存在");
            widgetShake(ui->label_5,5);
            ui->lineEdit_1->setFocus();
            return;
        }
        else{
            ui->label_5->setText("");
        }
        if(ui->lineEdit_2->text().isEmpty()){
            ui->label_6->setText("不能为空");
            widgetShake(ui->label_6,5);
            ui->lineEdit_2->setFocus();
            return;
        }
        else{
            ui->label_6->setText("");
        }
        emit sendtext(ui->lineEdit_1->text(),ui->lineEdit_2->text(),ui->lineEdit_3->text(),ui->lineEdit_4->text());
        this->close();
    }
    void MessageBox7::on_btn_false_clicked()
    { 
        this->close();
    }
    void MessageBox7::receivetext(QString res1,QString res2,QString res3,QString res4,QStringList has)
    {
        ui->lineEdit_1->setText(res1);
        ui->lineEdit_2->setText(res2);
        ui->lineEdit_3->setText(res3);
        ui->lineEdit_4->setText(res4);
        m_hascode=has;
        m_hascode.removeAt(m_hascode.indexOf(res1));
        qDebug()<<m_hascode;
        if(res1.isEmpty()&&res2.isEmpty()&&res3.isEmpty()&&res4.isEmpty())
            ui->lab_title->setText("用户增加");
        else
            ui->lab_title->setText("用户修改");
    }
    //振动效果
    void MessageBox7::widgetShake(QWidget *pWidget, int nRange)
    {
        int nX = pWidget->x();
        int nY = pWidget->y();
        QPropertyAnimation *pAnimation = new QPropertyAnimation(pWidget,"geometry");
        pAnimation->setEasingCurve(QEasingCurve::InOutSine);
        pAnimation->setDuration(300);
        pAnimation->setStartValue(QRect(QPoint(nX,nY),pWidget->size()));
    
        int nShakeCount = 20; //抖动次数
        double nStep = 1.0/nShakeCount;
        for(int i = 1; i < nShakeCount; i++){
            nRange = i&1 ? -nRange : nRange;
            pAnimation->setKeyValueAt(nStep*i,QRect(QPoint(nX + nRange,nY),pWidget->size()));
        }
    
        pAnimation->setEndValue(QRect(QPoint(nX,nY),pWidget->size()));
        pAnimation->start(QAbstractAnimation::DeleteWhenStopped);
    }
    //打开屏幕键盘
    void MessageBox7::on_pushButton_keyboard_clicked()
    {
        //The code from david!!!
        PVOID OldValue;
        BOOL bRet = Wow64DisableWow64FsRedirection (&OldValue);
        QString csProcess="C:\\Windows\\System32\\osk.exe";
        QString params="";
        ShellExecute(NULL, L"open", (LPCWSTR)csProcess.utf16(), (LPCWSTR)params.utf16(), NULL, SW_SHOWNORMAL);
        if ( bRet )
        {
            Wow64RevertWow64FsRedirection(OldValue);
        }
        ui->lineEdit_1->setFocus();
    }
    void MessageBox7::closeEvent(QCloseEvent *event)
    {
        HWND appWnd;
        appWnd = ::FindWindow(L"OSKMainClass", NULL);
        if (appWnd){
           SendMessage(appWnd, WM_SYSCOMMAND, SC_CLOSE, 0);
           //qDebug() << "closeKeyboard succeed";
        }
        else{
           //qDebug() << "closeKeyboard failed";
         }
    }
    
    

    原理:就是普通的lineedot输入,传入参数中有当前多有的账号信息判断,进入后删除本身的信息,确定判断是否存在当前存在的账号信息,进行振动提示,输入内容为空也振动提示,注意函数判断空时用isempty,isnull是无效i的

    四、结语

    世上无难事

    暂时总结和使用这7个自定义的messagebox来。有需要的可以下载相关代码和背景图片资源,以及入口函数代码,下载点击这里

    展开全文
  • Qt自定义提示信息—QQ风格

    万次阅读 2016-12-20 12:42:46
    一、简述在 Qt 之 自定义提示信息框—迅雷风格 这篇文章中讲述了如何实现迅雷风格的自定义提示框。那么在这一篇中我们就讲述一下如何实现QQ风格的提示框。整体代码与Qt 之 自定义提示信息框—迅雷风格 中的代码类似...

    一、简述

    Qt 之 自定义提示信息框—迅雷风格 这篇文章中讲述了如何实现迅雷风格的自定义提示框。那么在这一篇中我们就讲述一下如何实现QQ风格的提示框

    整体代码与Qt 之 自定义提示信息框—迅雷风格 中的代码类似,主要是界面样式上的不同,下面先看一下效果图。

    这里写图片描述

    二、代码之路

    看代码之前需要看一下 Qt 之 自定义窗口标题栏 这一篇文章,因为这里用到了这篇文章中写到的自定义标题栏。

    这里新建任务窗口类MyMessageBox 继承了BaseWindow类,所以省去了一些代码实现(主要包括顶部标题栏、鼠标按住标题栏进行拖动,窗口背景色等 ),有需要的小伙伴可以去看一下这一篇文章。

    如果需要了解如何实现窗口的模态与非模态对话框可以看一下Qt 之 模态与非模态窗口的介绍及 实现QDialog的exec()方法 这一篇文章。

    mymessagebox.h

    #include <QWidget>
    #include "ui_mymessagebox.h"
    #include "basewindow.h"
    
    enum ChosseResult
    {
        ID_OK = 0,                      // 确定;
        ID_CANCEL                       // 取消;
    };
    
    enum MessageType
    {
        MESSAGE_INFORMATION = 0,        // 提示信息;
        MESSAGE_WARNNING,               // 提示警告;
        MESSAGE_QUESTION,               // 提示询问;
        MESSAGE_INPUT                   // 提示输入框;
    };
    
    enum MessageButtonType
    {
        BUTTON_OK = 0,                  // 只有确定按钮;
        BUTTON_OK_AND_CANCEL,           // 确定、取消按钮;
        BUTTON_CLOSE                    // 关闭按钮;
    };
    
    class MyMessageBox : public BaseWindow
    {
        Q_OBJECT
    
    public:
        MyMessageBox(QWidget *parent = 0);
        ~MyMessageBox();
    
        void setWindowTitle(QString title, int titleFontSize = 10);
        void setContentText(QString contentText);
        void setMessageType(MessageType messageType);
        void setButtonType(MessageButtonType buttonType);
        void setMessageContent(QString messageContent);
    
    public:
        int static showMyMessageBox(QWidget* parent, const QString &title,const QString &contentText , MessageType messageType, MessageButtonType messageButtonType , bool isModelWindow = false);
    
    
    private:
        void initWindow();
        void initTitleBar();
        int exec();
    
        void paintEvent(QPaintEvent *event);
        void closeEvent(QCloseEvent *event);
    
    private slots:
        void onOkClicked();
        void onCancelClicked();
    
    private:
        Ui::MyMessageBox ui;
        QEventLoop* m_eventLoop;
        ChosseResult m_chooseResult;
    };
    

    mymessagebox.cpp

    #include "mymessagebox.h"
    #include <QPainter>
    #include <QCloseEvent>
    
    MyMessageBox::MyMessageBox(QWidget *parent)
        : BaseWindow(parent)
        , m_eventLoop(NULL)
        , m_chooseResult(ID_CANCEL)
    {
        ui.setupUi(this);
        initWindow();
    }
    
    MyMessageBox::~MyMessageBox()
    {
    
    }
    
    void MyMessageBox::initWindow()
    {
        initTitleBar();
        loadStyleSheet("MyMessageBox/MyMessageBox");
        Qt::WindowFlags flags = this->windowFlags();
        this->setWindowFlags(flags | Qt::Window);
    
        ui.inputContent->setVisible(false);
    
        connect(ui.pButtonOk, SIGNAL(clicked()), this, SLOT(onOkClicked()));
        connect(ui.pButtonCancel, SIGNAL(clicked()), this, SLOT(onCancelClicked()));
    }
    
    // 初始化标题栏;
    void MyMessageBox::initTitleBar()
    {
        m_titleBar->move(0, 0);
        m_titleBar->setWindowBorderWidth(0);
        // 设置标题栏颜色,在迅雷风格中标题栏默认为白色;
        m_titleBar->setBackgroundColor(185, 92, 125);
        m_titleBar->setButtonType(ONLY_CLOSE_BUTTON);
        m_titleBar->setTitleWidth(this->width());
        // 设置标题栏图标,在迅雷风格中没有设置图标;
        m_titleBar->setTitleIcon(":/Resources/MyMessageBox/WindowIcon.png", QSize(16, 16));
    }
    
    void MyMessageBox::paintEvent(QPaintEvent *event)
    {
        QPainter painter(this);
    
        // 绘制窗口白色背景色;
        QPainterPath pathBack;
        pathBack.setFillRule(Qt::WindingFill);
        pathBack.addRoundedRect(QRect(0, 0, this->width(), this->height()) , 3 , 3);
        painter.setRenderHint(QPainter::SmoothPixmapTransform, true);
        painter.fillPath(pathBack, QBrush(QColor(255, 255, 255)));
    
        // 绘制按钮部分灰色背景;
        QPainterPath pathButtonBack;
        pathButtonBack.setFillRule(Qt::WindingFill);
        pathButtonBack.addRoundedRect(QRect(0, 116, this->width(), 48) , 3 , 3);
        painter.setRenderHint(QPainter::SmoothPixmapTransform, true);
        painter.fillPath(pathButtonBack, QBrush(QColor(245, 230, 233)));
    
        return QWidget::paintEvent(event);
    }
    
    void MyMessageBox::setWindowTitle(QString title , int titleFontSize)
    {
        m_titleBar->setTitleContent(title, titleFontSize);
    }
    
    void MyMessageBox::setContentText(QString contentText)
    {
        ui.MessageContent->setText(contentText);
    }
    
    void MyMessageBox::setMessageType(MessageType messageType)
    {
        switch (messageType)
        {
        case MESSAGE_INFORMATION:
            ui.MessageIcon->setPixmap(QPixmap(":/Resources/MyMessageBox/information.png"));
            break;
        case MESSAGE_WARNNING:
            ui.MessageIcon->setPixmap(QPixmap(":/Resources/MyMessageBox/warnning.png"));
            break;
        case MESSAGE_QUESTION:
            ui.MessageIcon->setPixmap(QPixmap(":/Resources/MyMessageBox/question.png"));
            break;
        case MESSAGE_INPUT:
            ui.MessageIcon->setVisible(false);
            ui.inputContent->setVisible(true);
        default:
            break;
        }
    }
    
    void MyMessageBox::setButtonType(MessageButtonType buttonType)
    {
        switch (buttonType)
        {
        case BUTTON_OK:
        {
            ui.pButtonOk->setText(QStringLiteral("确定"));
            ui.pButtonCancel->setVisible(false);
        }
            break;
        case BUTTON_OK_AND_CANCEL:
        {
            ui.pButtonOk->setText(QStringLiteral("确定"));
            ui.pButtonCancel->setText(QStringLiteral("取消"));
        }
            break;
        default:
            break;
        }
    }
    
    void MyMessageBox::setMessageContent(QString messageContent)
    {
        ui.MessageContent->setText(messageContent);
    }
    
    int MyMessageBox::showMyMessageBox(QWidget* parent, const QString &title, const QString &contentText, MessageType messageType, MessageButtonType messageButtonType, bool isModelWindow)
    {
        MyMessageBox * myMessageBox = new MyMessageBox(parent);
        myMessageBox->setWindowTitle(title);
        myMessageBox->setContentText(contentText);
        myMessageBox->setMessageType(messageType);
        myMessageBox->setButtonType(messageButtonType);
        if (isModelWindow)
        {
            // 设置为模态窗口时,参数parent必须设置父窗口指针,否则模态设置无效;
            // 因为 Qt::WindowModal 参数只对父窗口有效,如果想要模态对全局窗口都有效可以设置 Qt::ApplicationModal
            return myMessageBox->exec();
        }
        else
        {
            myMessageBox->show();
        }
    
        return -1;
    }
    
    int MyMessageBox::exec()
    {
        // 因为QWidget没有exec()方法,所以需要自己定义来完成exec()方法;
        // 而exec()方法就是直接设置窗口显示为模态,并且窗口关闭结束后返回用户选择结果(按了确定还是取消按钮);
        // 而show()方法只是显示窗口,并不会设置窗口的模态或者非模态,需要自己调用setWindowModality()方法进行设置;
        // 而且show()方法并不会返回用户选择结果;
        // 这里也可以继承QDialog类,QDialog有自己的exec()方法,根据返回 Accepted, Rejected来决定是否按了确定按钮;
    
        // 设置为窗口级模态,也可设置为应用程序及模态 Qt::ApplicationModal;
        this->setWindowModality(Qt::WindowModal); 
        show();
        // 使用事件循环QEventLoop ,不让exec()方法结束,在用户选择确定或者取消后,关闭窗口结束事件循环,并返回最后用户选择的结果;
        // 根据返回结果得到用户按下了确定还是取消,采取相应的操作。从而模拟出QDialog类的exec()方法;
        m_eventLoop = new QEventLoop(this);
        m_eventLoop->exec();
    
        return m_chooseResult;
    }
    
    void MyMessageBox::onOkClicked()
    {
        m_chooseResult = ID_OK;
        close();
    }
    
    void MyMessageBox::onCancelClicked()
    {
        m_chooseResult = ID_CANCEL;
        close();
    }
    
    void MyMessageBox::closeEvent(QCloseEvent *event)
    {
        // 关闭窗口时结束事件循环,在exec()方法中返回选择结果;
        if (m_eventLoop != NULL)
        {
            m_eventLoop->exit();
        }
        event->accept();
    }

    样式

    *{font-family:Microsoft YaHei;}
    
    QLabel#MessageContent
    {
        font-size:14px;
    }
    
    QPushButton#pButtonOk
    {
        border-radius:3px;
        background-color:rgb(244 , 244 , 244);
        border: 1px solid rgb(160 , 150 , 152);
    }
    
    QPushButton#pButtonOk:hover
    {
        background-color:rgb(190 , 231 , 253);
        border: 1px solid rgb(79 , 173 , 216);
    }
    
    QPushButton#pButtonOk:pressed
    {
        background-color:rgb(235 , 236 , 237);
        border: 1px solid rgb(79 , 173 , 216);
        padding-left:2px;
        padding-top:2px;
    }
    
    QPushButton#pButtonCancel
    {
        border-radius:3px;
        background-color:rgb(244 , 244 , 244);
        border: 1px solid rgb(160 , 150 , 152);
    }
    
    QPushButton#pButtonCancel:hover
    {
        background-color:rgb(190 , 231 , 253);
        border: 1px solid rgb(79 , 173 , 216);
    }
    
    QPushButton#pButtonCancel:pressed
    {
        background-color:rgb(235 , 236 , 237);
        border: 1px solid rgb(79 , 173 , 216);
        padding-left:2px;
        padding-top:2px;
    }
    
    QLineEdit#inputContent
    {
        border: 1px solid rgb(195 , 195 , 195);
    }
    
    QLineEdit#inputContent:hover
    {
        border: 1px solid rgb(1 , 186 , 255 );
    }

    测试代码

    设置为模态窗口

    设置父窗口指针

    void onButtonClicked()
    {
        // showMyMessageBox()方法的最后一个参数为是否设置提示框为模态窗口;
        // 设置提示框为模态窗口,那么必须将父窗口指针传进showMyMessageBox()方法中,否则模态无效;
        // 因为MyMessageBox模态时设置的为Qt::WindowModal,只会影响父窗口,如需要阻塞整个应用程序,可设置为Qt::ApplicationModal;
        int result = MyMessageBox::showMyMessageBox(this, QStringLiteral("删除好友"), QStringLiteral("您确定要删除XXX好友吗?"), MESSAGE_WARNNING, BUTTON_OK_AND_CANCEL, true);
        if (result == ID_OK)
        {
            ui.label->setText(QStringLiteral("结果:确定"));
        }
        else if (result == ID_CANCEL)
        {
            ui.label->setText(QStringLiteral("结果:取消"));
        }
        else
        {
            ui.label->setText(QStringLiteral("非模态窗口"));
        }
    }

    效果图一

    这里写图片描述

    我们看到设置为模态窗口,弹出提示框后,父窗口被阻塞,无法响应我们的操作。并且在我们点击确定/取消 按钮后,调用showMyMessageBox()方法之后的代码得以执行。
    测试代码中根据showMyMessageBox()的返回值来设置父窗口界面上显示用户操作结果(点击确定还是取消),而这些操作都是在提示框关闭之后执行的。以此说明,父窗口的操作都会被阻塞直到关闭提示框。


    不设置父窗口指针

    我们将showMyMessageBox()方法中的父指针修改为NULL。来看看效果

    int result = MyMessageBox::showMyMessageBox(NULL, QStringLiteral("删除好友"), QStringLiteral("您确定要删除XXX好友吗?"), MESSAGE_WARNNING, BUTTON_OK_AND_CANCEL, true);

    效果图二

    这里写图片描述

    我们看到打开提示框后,父窗口仍可接受用户响应(可以移动,并且点击打开窗口按钮,可以再次弹出一个提示框)。但是父窗口中显示的结果(确定/取消)还是在提示框关闭之后进行更新,说明设置为模态窗口后,尽管不设置父窗口指针,showMyMessageBox()方法之后的代码要等待窗口关闭之后才能执行。


    设置为非模态窗口

    设置父窗口指针

    我们将showMyMessageBox()方法最后一个参数修改为false,设置为非模态窗口。

    int result = MyMessageBox::showMyMessageBox(this, QStringLiteral("删除好友"), QStringLiteral("您确定要删除XXX好友吗?"), MESSAGE_WARNNING, BUTTON_OK_AND_CANCEL, false);

    效果图三

    这里写图片描述

    我们看到设置为非模态窗口,打开提示框,并不会阻塞父窗口的响应。同时,我们将父窗口指针传入showMyMessageBox()方法中,我们看到提示框会一直显示在父窗口之上。在Qt中子窗口会一直显示在父窗口之上

    同时,设置为非模态,showMyMessageBox()方法会立即返回,不会阻塞后面代码的执行。我们也看到在打开提示框时,父窗口结果立即更新为非模态窗口,而不是在提示框关闭之后。


    不设置父窗口指针

    int result = MyMessageBox::showMyMessageBox(NULL, QStringLiteral("删除好友"), QStringLiteral("您确定要删除XXX好友吗?"), MESSAGE_WARNNING, BUTTON_OK_AND_CANCEL, false);

    效果图四

    这里写图片描述

    将父窗口指针修改为NULL后,我们发现提示框不会一直显示在父窗口之上了。


    这里我们在 Qt 之 自定义提示信息框—迅雷风格 代码的基础上修改了样式,得到了QQ风格的自定义提示框效果。代码很简单,关键在于尝试。

    有兴趣的小伙伴可以自行修改样式,来实现另一番效果。欢迎一起交流哈 O(∩_∩)O!


    更多文章

    Qt 之 自定义提示信息框—迅雷风格

    Qt 之 模态与非模态窗口的介绍及 实现QDialog的exec()方法

    Qt 之 自定义窗口标题栏

    代码下载

    Qt 之 自定义提示信息框—QQ、迅雷风格 (包含了QQ和迅雷两种风格的提示框)

    展开全文
  • QT QML自定义等待提示框

    千次阅读 2017-07-24 15:19:50
    QT QML自定义等待提示框最近项目需要一个等待提示框,因为是使用QT写的项目,没有找到这方面资料,就自己封装了一个简单的demo,记录下来,以便以后使用。 使用的qml 中 Canvas自定义画图仿钉钉中的等待提示框。 ...
  • Qt界面,当用户注册时输入的格式不正确时, 用TipBox弹框提示,来提示用户该如何输入:
  • QT自定义的气泡类型提示框

    千次阅读 2018-08-15 10:20:33
    由于项目需要,自定义了一个QT气泡显示的控件,参照了一部分网上的代码,自己也修改了许多,可支持四个不同的方向。不多说,上图: 代码如下: const int SHADOW_WIDTH = 15; // 窗口阴影宽度; const ...
  • QT自定义加载等待提示框 一、效果展示 二、源代码 #ifndef LOADINGDIALOG_H #define LOADINGDIALOG_H #include <QMovie> #include <QLabel> #include <QDialog> #include <QPainter> #...
  • 网页右下角上经常会出现一些提示性的信息,B/S有的东西,C/S当然也可以有,就像QQ的消息提示一样! 实现一个类似的东西并不困难,只要想明白原理实现起来就很简单了!   实现原理: (1)显示:右下角缓慢弹出...
  • Qt自定义MessageBox提示框

    千次阅读 2016-11-18 11:47:35
    概述: 在做项目时,我们经常会用到QMessageBox这个控件,但有时候Qt自己提供的...消息提示框的控件类,有什么不对的地方,希望大家一起交流! 头文件: /** * @brief 自定义MessageBox * @file custommessagebox.h *
  • Qt qml 自定义消息提示框

    千次阅读 2017-10-28 16:12:16
    Qt qml 自定义消息提示框   QtQuick有提供比较传统的信息提示框MessageDialog,但是实际开发过程并不 太能满足我们的需求。下面是根据controls2模块中Dialog控件自定义的简单的信息提示框。 可以根据信息的多少...
  • Qt 实现了精美的 QQ和迅雷风格的自定义提示框,模仿度99.99%,支持模态和非模态窗口设置。详情可见博客文章 http://blog.csdn.net/goforwardtostep/article/details/53760769
  • Qt自定义一个简单的ToolTip提示框

    千次阅读 2020-06-07 19:29:16
    因为 QToolTip 自定义样式不大方便,而且半透明也没法设置。Qt中的顶层 widget 好像默认是不支持透明样式的,可以设置: setWindowFlags(Qt::FramelessWindowHint); setAttribute(Qt::WA_TranslucentBackground,...
  • Qt自定义搜索

    万次阅读 多人点赞 2015-12-19 10:44:14
    简述关于搜索,大家都经常接触。例如:浏览器搜索、Windows资源管理器搜索等。当然,这些对于Qt实现来说毫无压力,只要思路清晰,分分钟搞定。 方案一:调用QLineEdit现有接口void addAction(QAction * action, ...
  • Qt自定义搜索QLineEdit

    千次阅读 2019-08-29 10:58:41
    Qt自定义搜索 2015年12月19日 10:44:14一去丶二三里阅读数 15126更多 分类专栏:QtQt 实战一二三》 版权声明:本文为博主原创文章,遵循CC 4.0 by-sa版权协议,转载请附上原文出处链接和本声明。 本文...
  • Qt自定义提示信息—迅雷风格

    千次阅读 2016-12-13 22:25:24
    我们可以根据设置不同的参数来设置提示框标题、显示内容、显示图标、下方按钮个数,可以设置为输入框,也可以设置为模态/非模态对话框,实现了自定义的QMessageBox。目前实现了提示框基本功能,后续将继续拓展更多...
  • Qt自定义搜索

    2018-01-04 14:59:45
    关于搜索,大家都经常接触。例如:浏览器搜索、Windows资源管理器搜索等。 当然,这些对于Qt实现来说毫无压力,只要思路清晰,分分钟搞定。 方案一:调用QLineEdit现有接口 void addAction(QAction *...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 4,529
精华内容 1,811
关键字:

qt自定义提示框