qt自定义控件-多类别提示框

2023-10-30

一、前言

用惯了自带的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来。有需要的可以下载相关代码和背景图片资源,以及入口函数代码,下载点击这里

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

qt自定义控件-多类别提示框 的相关文章

  • Dart中List的常用方法概述及使用案例

    在Dart中 List是一种有序的集合 它提供了许多有用的方法来操作列表数据 Flutter使用Dart语言开发 所以在Flutter中依然适用 下面是List常用的方法概述及使用案例 length属性 List的length属性返回Lis
  • pandas的时间对象

    pandas时间处理对象 pandas中有个时间库 datautil 可以使用其中的方法把多种字符串时间格式转化为时间对象 import dateutil import pandas as pd a dateutil parser pars
  • git还原到某个版本

    1 tortoisegit还原 v2还原到v1 1 1 强制还原 git reset 如果使用这种方式还原到v1 将丢失还原到v1到v2之间的所有提交及日志 1 1 1 显示日志 有save1 save2两条提交记录 1 1 2 重置版本
  • Git的理解与使用

    文章目录 一 初识Git 1 1 分布式管理系统 1 2 Git的安装与配置 二 Git理论 2 1 四个工作区域 2 2 提交代码的简易流程 2 3 Git所管理文件的四种状态 三 Git命令 3 1 基础命令 git init git
  • hash函数应用(整理)

    评估hash函数优劣的基准主要有以下两个指标 1 散列分布性 即桶的使用率backet usage 已使用桶数 总的桶数 这个比例越高 说明分布性良好 是好的hash设计 2 平均桶长 即avg backet len 所有已使用桶的平均长度
  • iTween基础之Rotate(旋转角度)

    一 基础介绍 二 基础属性 原文地址 http blog csdn net dingkun520wy article details 50696489 一 基础介绍 RotateTo 旋转游戏
  • Java判断字符串是否为数字(正负、小数)

    需求 传来一个String类型的参数 需要判断该参数是否为数字 正负 正数 小数都要能判断 吗 如果是小数则保留2位小数 开始采用Character isDigit 方法来判断一个字符串是否为数字 只能判断全是数字的字符串 不能判断小数 负
  • Anaconda创建虚拟环境+Pycharm使用Anaconda创建的虚拟环境

    首先需要下载anaconda然后在搜索栏中搜索Anaconda Prompt anaconda 点击进入 进入到envs目录然后输入以下命令 conda create n to pack python 3 7 创建一个名为 to pack且
  • vue动态绑定class属性

    vue动态绑定class的方式 第一种 对象的方式 class iscolor boo 第一个参数iscolor为类名 第二个参数boo是一个变量 类型为一个boolean值 div scope row state div data ret
  • 三角形边长求高的c语言函数公式,三角形边长计算公式

    大写数字网今天精心准备的是 三角形边长计算公式 下面是详解 求三角形的边长公式 三角形的边长公式 1 在任何一个三角形中 任意一边的平方等于另外两边的平方和减去这两边的2倍乘以它们夹角的余弦 几何语言 在 ABC中 a b c 2bc co
  • js数组分类,一维数组转二维数组

    原始数组 var arrayFirst code 1 datas a网吧 code 1 datas b网吧 code 2 datas a酒店 code 2 datas b酒店 code 3 datas a学校 code 3 datas b学
  • Flume系统搭建和使用的一些经验总结-搭建篇

    对于很多公司来说 日志的收集和集中管理是一个必然要经历的阶段 我们公司在经历了一拖再拖之后 终于不得不开始搭建日志收集系统了 对于日志收集系统 我们的首选就是Flume 为何这么坚决呢 难道没有其他工具能做个这个事情么 当然有 不过 考虑到
  • 神经网络 01(介绍)

    一 神经网络 人工神经网络 Artificial Neural Network 简写为ANN 也简称为神经网络 NN 是一种模仿生物神经网络结构和功能的 计算模型 人脑可以看做是一个生物神经网络 由众多的神经元连接而成 各个神经元传递复杂的
  • 【夜莺监控方案】01-n9e-v5-server部署

    文章目录 前言 1 在线一键安装 不推荐 2 自主安装 推荐 官方安装脚本 2 1 mysql 2 2 prometheus 2 3 n9e server 2 4 启动和开机自启 2 5 web查看 3 配置LDAP 前言 相关文档如下 0

随机推荐

  • Python自制音乐下载器,实现听歌自由

    前言 今天发的就是最实用的文章 让你用Python实现听歌自由 不用再担心自己的钱包了 文章末尾名片可直接领取代码 代码实现 导入模块 import os import re from urllib import parse import
  • [人工智能-深度学习-75]:环境 - Windows配置Github、Gitee共存的Git环境

    作者主页 文火冰糖的硅基工坊 文火冰糖 王文兵 的博客 文火冰糖的硅基工坊 CSDN博客 本文网址 https blog csdn net HiWangWenBing article details 122261638 目录 前言 前置条件
  • 获取response里的数据

    String out null try ServletOutputStream os servletResponse getOutputStream Field ob ReflectionUtils findField os getClas
  • VS2015/QT creator + Qt5.8.0

    PS 两个版本IDE都试过 VS的报错更详细 方便找bug QT creator的界面更可爱 输入时有绿色的Q弹的图标嘻嘻 QT版本 qt opensource windows x86 msvc2015 64 5 8 0 win10 vs2
  • 微信小程序实例系列

    实战 微信小程序 redux 在原生微信小程序的使用实例 微信小程序 weapp redux的使用文档 微信小程序 Promise then success fail 执行顺序的问题 微信小程序 监听页面停止滚动 微信小程序 CustomB
  • PIM协议原理与配置

    PIM协议原理 PIM Protocol Independent Multicast 协议无关组播 目前常用版本是PIMv2 PIM报文直接封装在IP报文中 协议号为103 PIMv2组播地址为224 0 0 13 在PIM组播域中 以组播
  • LOAM_velodyne学习(三)

    终于到第三个模块了 我们先来回顾下之前的工作 点云数据进来后 经过前两个节点的处理可以完成一个完整但粗糙的里程计 可以概略地估计出Lidar的相对运动 如果不受任何测量噪声的影响 这个运动估计的结果足够精确 没有任何漂移 那我们可以直接利用
  • jenkins报“”Build step 'Execute Windows batch command' marked build as failure“”

    报错信息如下 解决方法
  • JVM垃圾回收器

    1 垃圾回收器的位置 2 垃圾回收器的基本概念 什么是垃圾回收器 JVM 为 Java 提供了垃圾回收机制 是一种偏自动的内存管理机制 简单来说 垃圾回收器会自动追踪所有正在使用的对象 并将其余未被使用的对象标记为垃圾 JVM会自动进行垃圾
  • 前端知识

    http www yyyweb com 5136 html 当经历所有大厂的实习后 小鱼 发布于 2018 08 15 分类 程序人生 阅读 43 评论 0 七月虽然不是一个丰收的季节 但却是一个十分酷热的月份 不知有多少小伙伴跟我一样 顶
  • MySQL server和workbench安装使用

    1 安装Notepad 运行下载的 npp 7 9 Installer x64 exe 2 安装MySQL 将mysql 8 0 22 winx64 zip解压缩 我将其放置D盘根目录下 进入文件夹 在目录中新建文件夹data和文件my i
  • docker登录私有镜像仓库时报错: x509: certificate signed by unknown authority

    文章目录 描述 报错 解决步骤 描述 由于机器在内网无法使用yum或rpm安装docker 所以使用的是离线安装 安装完成后 发现无法登录镜像地址 报错 Error response from daemon Get https swr cn
  • 队列的应用——(一)广度优先搜索

    在队列中 同样可以用于走迷宫 而且会出现一个与之前不同的情形 代码如下 C myqueue h include
  • OTA-apache本地服务器的搭建以及配置说明

    1 下载适配到本机型的Apache msi软件 这里我的电脑是32位的 下载的是apache 2 2 8 win32 x86 no ssl msi 2 apache环境变量的搭建 在计算机系统 gt 高级 gt 环境变量下的PATH后面添加
  • 一次注册表事故--无法打开exe文件

    下载了腾讯手游助手之后发现exe 的安装程序打不开 这就很郁闷了 下载了不同版本的都是打不开 难道是安装包有问题 为什么别人的电脑就能安装 我的电脑exe文件都能打开 为什么就腾讯手游助手不能打开呢 去网上搜集解决方法 百度经验上看到 说是
  • Cuda10.1总结1-概述

    概述 参考文献 官方在线文档 https docs nvidia com cuda archive 10 1 由于网页加载速度比较慢 可以参考如下文档 CUDA C Programming Guide C编程指南 CUDA C Best P
  • Android利用GridView制作横向列表

    p p p p p 1 在Activity对应的xml内 p p p pre class html pre
  • CSS重构

    1 重构和架构 重构是指在不改变代码行为的前提下 重写代码 使其更加简洁 易于复用 架构是指软件项目的各个不同部件之间的组合方式 优秀的架构 可预测 可以对软件的工作方式和结构做出准确的假设 可复用 在多处使用同一代码 无需重写 可扩展 比
  • 索引 第2关:用alter table创建索引

    任务描述 使用ALTER TABLE语句 1 为product商品表的descn商品详情的前两个字符和catid目录编号列添加索引descn catid 2 为product商品表的name商品名列添加唯一性索引unique name 3
  • qt自定义控件-多类别提示框

    一 前言 用惯了自带的messagebox 或者感觉效果不是很好看 或者有界面的特殊美观需求等等 那么就定制吧 1 单选项提示框 2 双选项提示框 3 滚动选项提示框 4 密码提示框 5 多组合选项提示框1 6 多组合选项提示框2 7 多组