qt之常用简单、便捷方法记录(C++)

前言:

学习QML还是C++?

想到什么写什么,方便记录给自己看,也分享给百度的各位猿人们。

目录:

目录

前言:

目录:

正文:

1.获取某一字符串在另一长字符串中出现次数:

2.设置exe显示图标

3.将16进制数组转换为字符串显示

4.emit槽函数简单说明使用

5.16进制数组转换为10进制整数

6.避免循环循环太快接收不到消息队列 导致界面假死现象

7.右下角显示托盘图标(缩到后台运行)

8.创建动态一维数组

9.获取发送信号端标识

10.替换多种字符串

11.connect使用Lambda 函数写法免去链接槽

12.CRC16函数

13.路径选择与指定文件选择

14.TXT的存储与读取

15.字符串拆分字节

16.将窗口放在最前面,不受任何外部界面影响,超过ApplicationModal

17.全局声明函数的最佳方式(其他类可调用使用)

18.遍历文件夹

19.定时关闭单项/双项提示框

20.数字转字符串固定长度0位补齐

21.textedit插入文本并设置插入文本不同颜色字体

22.视频播放功能(AVI)

23.tablewidget快速赋值使用(解决行高自适应)

24.QCustomplot曲线模式通用界面及函数(随用随复制粘贴)

25.QCustomplot柱状模式通用界面及函数(随用随复制粘贴)

26.实现控件的振动效果

27.十六进制转浮点型数据

28.高分辨率屏幕显示界面与ui保持一致

29.阻塞线程延时,处理完之前在延时之后

30.点击屏幕关闭窗口

31.设置窗口置顶/无边框/去掉最大化最小化按键

32.平板电脑触摸事件识别

33.代替QProcess快速打开文件函数

34.打开新ui界面,关闭时释放全部资源

35.通过控件名称快速定位到控件使用


正文:

1.获取某一字符串在另一长字符串中出现次数:

啊哦,qt中未找到实现方式,还得自己写方式,暂时空

2.设置exe显示图标

在pro文件添加

win32:{
RC_FILE     += appico.rc
}

在文件中填上图片生成的ico 文件,不能直接改尾缀名,否则编译报错。

文件内容:IDI_ICON1   ICON    DISCARDABLE "PIC/bayi.ico"

3.将16进制数组转换为字符串显示

例如0x11 0x22 0xaa 0xbb,转换成字符串1122aabb

char tdate[200];
char c1,c2;
for (i = 0; i < bytelen; i++)
{
       c1 = rxdata[i] & 0xFu;
       c2 = (rxdata[i] >> 4) & 0xFu;
       sprintf((char*)tdate + i * 2, "%x%x", c2, c1);//若转换为大写字符串,则%X
}

以上是分割开字符串的参考例程,不拆去掉判断i即可,其中i循环次数为需要数组转换字符串 的长度

方法二:

QString sall="",ssingle="";
ssingle.clear();
 for(int j=0;j

方法三:

qDebug()<

4.emit槽函数简单说明使用

假如有A类和B类,想要通过B中的某个信号触发了传递给A类处理

B.cpp

 emit new_mod_end(ui->lineEdit->text());

B.h

signals:
    void new_mod_end(QString);

A.cpp

//初始化或者新建B类的时候
B*kufangname= new B();
kufangname->show();
kufangname->setAttribute(Qt::WA_DeleteOnClose);//若是关闭界面,则彻底释放资源
connect(kufangname,SIGNAL(new_mod_end(QString)),this,SLOT(on_pushButton_save_clicked(QString)));


//触发时刻
void A::on_pushButton_save_clicked(QString aaa)
{
    qDebug()<

A.h

private slots:
    void on_pushButton_save_clicked(QString);

5.16进制数组转换为10进制整数

    unsigned long long number=0;//定义一个8字节无符号型整数,想要将此整数用于存放unix时间
    for(int i=0;i<8;i++){//localddno数组里是8个字节的数,将他们组合到一起
        number=number<<8;
        number=number|localddno[7-i];
    }
    //输出number用于使用

6.避免循环循环太快接收不到消息队列 导致界面假死现象

QCoreApplication::processEvents(QEventLoop::AllEvents, 10);//设置时间
QCoreApplication::processEvents();//不带时间

7.右下角显示托盘图标(缩到后台运行)

包含头文件QSystemTrayIcon

    QSystemTrayIcon *trayIcon;
    trayIcon= new QSystemTrayIcon(this);
    trayIcon->setIcon(QIcon(":/PIC/Logo.ico"));
    trayIcon->setToolTip(tr("WeChat:kuangboqi123\nTIM:1950361006\n工作时间:xxxh\n消息提醒:关闭(F8)"));    //设置鼠标放上去显示的信息
    QMenu *menu = new QMenu(this);			 //右键菜单
    menu->addAction(ui->action_WEB);                       //这几个action是在设计师下添加的
    menu->addAction(ui->action_QT);
    menu->addAction(ui->action_man);
    menu->addAction(ui->actionExit);
    trayIcon->setContextMenu(menu); 			 //设置右键菜单
    connect(trayIcon, SIGNAL(activated(QSystemTrayIcon::ActivationReason)),
               this, SLOT(slotIconActivated(QSystemTrayIcon::ActivationReason)));
    trayIcon->show();				

对应的槽函数:

//将缩到后台的程序放在最顶端
void MainWindow::slotIconActivated(QSystemTrayIcon::ActivationReason reason)
{
    switch(reason)
    {
    case QSystemTrayIcon::Trigger :
        setWindowState(Qt::WindowActive);
        activateWindow();

        break;
    default:
        break;
    }
}

8.创建动态一维数组

//分配动态一维数组

int *arr=new int[n];

用完后要记得释放:

//释放arr数组

delete[] arr;

9.获取发送信号端标识

sender()返回的是QObject*类型的,可以用qobject_cast进行类型转换,比如:
void XX::on_pushButton_clicked()
{
    QPushButton *button = qobject_cast(sender());
    QString strButtonText = button->text();
  ......
}

10.替换多种字符串

    QRegExp exp("[年月日-:-: ]");
    QString dddata="2019 年-16月:::  24日::--- -- ";
    QString newName =dddata.replace(exp,"");
    qDebug()<

这里一定要注意在exp()中,双引号内要加[],代表 替换[]内所有字符,否则就代表替换整体exp的字符串,这个耽误了我好几分钟时间。

11.connect使用Lambda 函数写法免去链接槽

    connect(ui->page1_repair, &QPushButton::clicked,[=](){
            /* do something.. */
        qDebug()<<"lambda 表达式";
        });

12.CRC16函数

quint16 MainWindow::crc16ForModbus(const QByteArray &data)
{
        static const quint16 crc16Table[] =
        {
            0x0000, 0xC0C1, 0xC181, 0x0140, 0xC301, 0x03C0, 0x0280, 0xC241,
            0xC601, 0x06C0, 0x0780, 0xC741, 0x0500, 0xC5C1, 0xC481, 0x0440,
            0xCC01, 0x0CC0, 0x0D80, 0xCD41, 0x0F00, 0xCFC1, 0xCE81, 0x0E40,
            0x0A00, 0xCAC1, 0xCB81, 0x0B40, 0xC901, 0x09C0, 0x0880, 0xC841,
            0xD801, 0x18C0, 0x1980, 0xD941, 0x1B00, 0xDBC1, 0xDA81, 0x1A40,
            0x1E00, 0xDEC1, 0xDF81, 0x1F40, 0xDD01, 0x1DC0, 0x1C80, 0xDC41,
            0x1400, 0xD4C1, 0xD581, 0x1540, 0xD701, 0x17C0, 0x1680, 0xD641,
            0xD201, 0x12C0, 0x1380, 0xD341, 0x1100, 0xD1C1, 0xD081, 0x1040,
            0xF001, 0x30C0, 0x3180, 0xF141, 0x3300, 0xF3C1, 0xF281, 0x3240,
            0x3600, 0xF6C1, 0xF781, 0x3740, 0xF501, 0x35C0, 0x3480, 0xF441,
            0x3C00, 0xFCC1, 0xFD81, 0x3D40, 0xFF01, 0x3FC0, 0x3E80, 0xFE41,
            0xFA01, 0x3AC0, 0x3B80, 0xFB41, 0x3900, 0xF9C1, 0xF881, 0x3840,
            0x2800, 0xE8C1, 0xE981, 0x2940, 0xEB01, 0x2BC0, 0x2A80, 0xEA41,
            0xEE01, 0x2EC0, 0x2F80, 0xEF41, 0x2D00, 0xEDC1, 0xEC81, 0x2C40,
            0xE401, 0x24C0, 0x2580, 0xE541, 0x2700, 0xE7C1, 0xE681, 0x2640,
            0x2200, 0xE2C1, 0xE381, 0x2340, 0xE101, 0x21C0, 0x2080, 0xE041,
            0xA001, 0x60C0, 0x6180, 0xA141, 0x6300, 0xA3C1, 0xA281, 0x6240,
            0x6600, 0xA6C1, 0xA781, 0x6740, 0xA501, 0x65C0, 0x6480, 0xA441,
            0x6C00, 0xACC1, 0xAD81, 0x6D40, 0xAF01, 0x6FC0, 0x6E80, 0xAE41,
            0xAA01, 0x6AC0, 0x6B80, 0xAB41, 0x6900, 0xA9C1, 0xA881, 0x6840,
            0x7800, 0xB8C1, 0xB981, 0x7940, 0xBB01, 0x7BC0, 0x7A80, 0xBA41,
            0xBE01, 0x7EC0, 0x7F80, 0xBF41, 0x7D00, 0xBDC1, 0xBC81, 0x7C40,
            0xB401, 0x74C0, 0x7580, 0xB541, 0x7700, 0xB7C1, 0xB681, 0x7640,
            0x7200, 0xB2C1, 0xB381, 0x7340, 0xB101, 0x71C0, 0x7080, 0xB041,
            0x5000, 0x90C1, 0x9181, 0x5140, 0x9301, 0x53C0, 0x5280, 0x9241,
            0x9601, 0x56C0, 0x5780, 0x9741, 0x5500, 0x95C1, 0x9481, 0x5440,
            0x9C01, 0x5CC0, 0x5D80, 0x9D41, 0x5F00, 0x9FC1, 0x9E81, 0x5E40,
            0x5A00, 0x9AC1, 0x9B81, 0x5B40, 0x9901, 0x59C0, 0x5880, 0x9841,
            0x8801, 0x48C0, 0x4980, 0x8941, 0x4B00, 0x8BC1, 0x8A81, 0x4A40,
            0x4E00, 0x8EC1, 0x8F81, 0x4F40, 0x8D01, 0x4DC0, 0x4C80, 0x8C41,
            0x4400, 0x84C1, 0x8581, 0x4540, 0x8701, 0x47C0, 0x4680, 0x8641,
            0x8201, 0x42C0, 0x4380, 0x8341, 0x4100, 0x81C1, 0x8081, 0x4040
        };
    quint8 buf;
    quint16 crc16 = 0xFFFF;
    for ( auto i = 0; i < data.size(); ++i ){
        buf = data.at( i ) ^ crc16;
        crc16 >>= 8;
        crc16 ^= crc16Table[ buf ];
    }
    return crc16;
}

使用方式:例如

    QByteArray sd;
    sd[0]=0xFE;
    sd[1]=0x06;
    sd[2]=0x00;
    sd[3]=0x01;
    sd[4]=0xaa;
    sd[5]=0xbb;
    quint16 aaa=crc16ForModbus(sd);
    sd[6]=aaa;
    sd[7]=aaa>>8;
    socket->write(sd);

13.路径选择与指定文件选择

    //获取路径
    QString dir = QFileDialog::getExistingDirectory(this, tr("选择存储路径"),"/home",QFileDialog::ShowDirsOnly|QFileDialog::DontResolveSymlinks);
    if(dir.isEmpty());
        massage_dialog(1,"提示","选择路径出错!");
    else{
    }
    //获取桌面路径
    QString desktop_path = QStandardPaths::writableLocation(QStandardPaths::DesktopLocation);
    QString fileName = desktop_path+"/" + timestr + ".ini";
    //获取指定文件
    QString fileName = QFileDialog::getOpenFileName(this,tr("选择待解密文件"),"",tr("TXT(*.txt *.ini)")); //选择路径
    if (fileName.isEmpty()){     //如果未选择文件便确认,即返回
        //QMessageBox::information(0,QObject::tr("Warning"),QObject::tr("文件为空!"));
    }
    else{}

14.TXT的存储与读取

读取:

        //读取txt
        QFile file(fileName);
        if (file.open(QIODevice::ReadOnly | QIODevice::Text))
        {
            while (!file.atEnd())
            {
                line = file.readLine();
            }

            file.close();
        }

 判断文件夹和文件是否存在,不存在创建,最后存储:

//单写入txt
    QFile file(fileName);
    file.open(QIODevice::WriteOnly | QIODevice::Text );
    QTextStream in(&file);
    in << “数据”;
    file.close();


//判断文件夹在写入
    QDir *folder = new QDir;
    bool exist = folder->exists(qApp->applicationDirPath()+"/history");//history文件夹是否存在
    if(!exist)folder->mkdir(qApp->applicationDirPath()+"/history");//不存在创建文件夹
    QFile file(qApp->applicationDirPath()+"/history/"+QDateTime::currentDateTime().toString("yyyyMMdd")+".db");
    file.open(QIODevice::WriteOnly|QIODevice::Text|QIODevice::Append);
    QTextStream stream(&file);
    stream<

15.字符串拆分字节

unsigned int rxdata[8];
QByteArray dataTemp="aabb112233445566";
for(int i=0;i<8;i++){//拆分字符串为字节
     rxdata[i]=(unsigned char)dataTemp.mid(i*2,2).toInt(&ok,16);
     //qDebug()<<"rxdata["<

16.将窗口放在最前面,不受任何外部界面影响,超过ApplicationModal

    MainWindow *pangfu=new MainWindow;
    pangfu->setWindowFlags(pangfu->windowFlags() | Qt::WindowStaysOnTopHint);
    pangfu->show();
    pangfu->raise();
    pangfu->setAttribute(Qt::WA_DeleteOnClose);

17.全局声明函数的最佳方式(其他类可调用使用)

在h文件中
public:
    explicit MainWindow(QWidget *parent = 0);
    ~MainWindow();
    static QPoint move_point;
    static uint chartP_count_page1;

在cpp开头
    QPoint MainWindow::move_point;
    uint MainWindow::chartP_count_page1;

18.遍历文件夹

方式一:

//只要文件,排除文件夹
QDir dir(place);
dir.setFilter(QDir::Files);//除了文件,其他的过滤掉
 QFileInfoList aaa=dir.entryInfoList();
//    aaa.removeFirst();//去掉文件自带的“.”
//    aaa.removeFirst();//去掉文件自带的“..”
for(int i = 0; i < aaa.size(); i++)qDebug()<dateEdit_history->text().replace(exp,"");
QVector listnum;//记录不在范围的序号
for(int i = 0; i < list_history.size(); i++){//筛选时间外的数据标号
    if(list_history.at(i).fileName().replace(exp,"")>sidetime)//判断时间
    listnum.append(i);
}
for(int i = 0; i < listnum.size(); i++)//剔除不在时间范围的文件记录
    list_history.removeLast();
//此时list_history是最终需要的

方式二:

QFileInfoList GetFileList(QString path)
{
    QDir dir(path);
    QFileInfoList file_list = dir.entryInfoList(QDir::Files | QDir::Hidden | QDir::NoSymLinks);
    QFileInfoList folder_list = dir.entryInfoList(QDir::Dirs | QDir::NoDotAndDotDot);

    for(int i = 0; i != folder_list.size(); i++){
         QString name = folder_list.at(i).absoluteFilePath();
         QFileInfoList child_file_list = GetFileList(name);
         file_list.append(child_file_list);
    }

    return file_list;
}
//全车型文件故障解析
void MainWindow::on_pushButton_7_clicked()
{
    QString dirIN = QFileDialog::getExistingDirectory(this, tr("选择需要解析的文件路径"),"/home",QFileDialog::ShowDirsOnly|QFileDialog::DontResolveSymlinks);
    if(dirIN.isEmpty());
    else{
        QDir *folder = new QDir;//创建文件夹
        temppath.append(dirIN+QString("/Temp%1").arg(QDateTime::currentDateTime().toString("yyyyMMddhhmmss")));//创建文件夹
        folder->mkdir(temppath.last());//创建文件夹

        QFileInfoList file_info_list =GetFileList(dirIN);
        foreach(QFileInfo fileinfo, file_info_list){
            //筛选后缀名为db的文件//筛选文件名长度为8的文件//筛选文件大小不为0的文件
            if(fileinfo.suffix()!="db"||fileinfo.baseName().length()!=8||fileinfo.size()==0)
                continue;
            QFile::copy(fileinfo.absoluteFilePath(),temppath.last()+"/"+fileinfo.baseName()+".db");
        }

        //.....
    }
}

19.定时关闭单项/双项提示框

bool massage_dialog(int button_num,QString tile_text,QString massage_content,char ff)
{
    int flag;
    QMessageBox *msgBox = new QMessageBox();
    QTimer::singleShot(5000,msgBox,SLOT(close())); //也可将accept改为close,定时关闭提示框,防止信号阻塞和假死
    /*调整提示框样式*/
    switch (button_num) {
    case 1:
        msgBox->addButton(QObject::tr("确定"), QMessageBox::YesRole);
        break;
    case 2:
        msgBox->addButton(QObject::tr("确定"), QMessageBox::YesRole);
        msgBox->addButton(QObject::tr("取消"), QMessageBox::NoRole);
        break;
    default:
        break;
    }
    msgBox->setWindowTitle(tile_text);
    msgBox->setText(massage_content);
    if(ff==0)msgBox->setIcon(QMessageBox::NoIcon);
    else if(ff==1)msgBox->setIcon(QMessageBox::Information);
    else if(ff==2)msgBox->setIcon(QMessageBox::Warning);
    else if(ff==3)msgBox->setIcon(QMessageBox::Critical);
    else if(ff==4)msgBox->setIcon(QMessageBox::Question);
    //msgBox->setStyleSheet("background-color:white");
    /*显示提示框*/
    QFont font;
    font.setPixelSize(25);
    msgBox->setFont(font);
    msgBox->setFixedSize(400, 400);
    flag = msgBox->exec();
    return flag;
}

参数1是选择单项还是双向1~2

参数2是提示框的标题any

参数3是提示框的文本any

参数4是提示框的图标类型0~4

目前设置是显示提示框之后无操作5秒自动关闭提示框,双向按键默认是取消按键,取消按键返回true,只有确认按键 才返回false,所以一般我们用双项提示框做是否判断处理时,语句如下

if(!massage_dialog(2,"标题","内容嘻嘻嘻?",4)){
    //点击了确认,处理数据
}
else{
    //取消了提示框,否定了提示框选择
}

20.数字转字符串固定长度0位补齐

比如1,我想转成 "001"

有两种方法:
方法一:

int i=1;
QString b=QString("%1").arg(i, 3, 10, QChar('0')); 
其中3表示需要保留3位数字,10是10进制,后面是以0补齐的意思。

方法二:

int cmd=1;
QString str=QString::number(cmd).sprintf("%03d",cmd);

21.textedit插入文本并设置插入文本不同颜色字体

//处理接收信号
void NetTest::comBatAnalyze(QByteArray &allData)
{
    QByteArray dataTemp;

    dataTemp=allData.toUpper();//大写转换
    QTextCharFormat fmt;
    fmt.setForeground(Qt::blue);//设置字体颜色
    QFont font("黑体",12,QFont::Bold,false);//设置字体,字号,粗体,斜体
    fmt.setFont(font);
    ui->textEdit->setCurrentCharFormat(fmt);
    ui->textEdit->append(QDateTime::currentDateTime().toString("[yyyy-MM-dd hh:mm:ss.zzz]"));
    dataTemp.clear();
    allData=dataTemp;
}

22.视频播放功能(AVI)

pro文件加上QT+=multimedia multimediawidgets
ui文件创建widget,button,slider
h文件
#include 
#include 
QMediaPlayer *mediaplayer;//ui提升为QvideoWidget
cpp文件
初始化
    mediaplayer=new QMediaPlayer(this);//创建mediaplayer
    //设置播放属性
    //监听信号变化函数
    connect(mediaplayer,&QMediaPlayer::stateChanged,[=](QMediaPlayer::State state){
        switch (state) {
        case QMediaPlayer::PlayingState:
            break;
        default:
            break;
        }
    });
    //播放进度信号变化函数
    connect(mediaplayer,&QMediaPlayer::positionChanged,[=](qint64 position){
        ui->horizontalSlider->setValue(position);//改变播放位置
    });
    //播放长度信号变化
    connect(mediaplayer,&QMediaPlayer::durationChanged,[=](qint64 duration){
        ui->horizontalSlider->setRange(0,duration);
    });
    //获取进度条的位置
    connect(ui->horizontalSlider,&QSlider::sliderMoved,[=](qint64 position){
        mediaplayer->setPosition(position);
    });
    //设置播放内容
    mediaplayer->setMedia(QUrl::fromLocalFile(qApp->applicationDirPath()+"/video/help.avi"));
    mediaplayer->setVideoOutput(ui->widget_2);//设置QVideoWidget
函数部分
//返回维修建议界面
void repairsuggest::on_pushButton_8_clicked()
{
    mediaplayer->stop();
    ui->pushButton_9->setChecked(false);
    ui->stackedWidget->setCurrentIndex(0);
}
//播放开始/暂停
void repairsuggest::on_pushButton_9_clicked()
{
    switch (mediaplayer->state()) {
    case QMediaPlayer::PlayingState:
        mediaplayer->pause();
        break;
    default:
        mediaplayer->play();
        break;
    }
}

23.tablewidget快速赋值使用(解决行高自适应)

    ui->tableWidget_gzk->clearContents();//清空内容
    ui->tableWidget_gzk->verticalHeader()->setVisible(false);//去掉行序号
    ui->tableWidget_gzk->horizontalHeader()->setFixedHeight(40); //设置表头的高度
    ui->tableWidget_gzk->horizontalHeader()->setStretchLastSection(true);//设置表格是否充满,即行末不留空
    //ui->tableWidget_gzk->horizontalHeader()->setSectionResizeMode(QHeaderView::Fixed); //禁止鼠标拖放列宽度
    ui->tableWidget_gzk->horizontalHeader()->setFocusPolicy(Qt::NoFocus); //设置表头不可选
    ui->tableWidget_gzk->horizontalHeader()->setHighlightSections(false); //设置表头不可选//QTableWidget表头塌陷问题解决
    ui->tableWidget_gzk->setEditTriggers(QAbstractItemView::NoEditTriggers);//设置表格内容不可修改
    ui->tableWidget_gzk->setSelectionBehavior(QAbstractItemView::SelectRows);//设置选中就是一行选中
    ui->tableWidget_gzk->setSelectionMode(QAbstractItemView::SingleSelection);//设置只能选中一行
    ui->tableWidget_gzk->setFocusPolicy(Qt::NoFocus);//设置去掉选中虚线框
    ui->tableWidget_gzk->setAlternatingRowColors(true);//设置表格颜色交替
    //表格滚动部分实现函数:初始化函数+以下俩函数+eventFilter(QObject *obj, QEvent *event)
    ui->tableWidget_gzk->viewport()->installEventFilter(this);//对此对象安装事件过滤器
    ui->tableWidget_gzk->setVerticalScrollMode(QAbstractItemView::ScrollPerPixel);//设置滚动模式按照像素滑动,做表格滑动时使用
    ui->tableWidget_gzk->setColumnCount(9);//设置列数量
    //for(int j=1;j<11;j++)
    //    ui->tableWidget_2->horizontalHeader()->setSectionResizeMode(j, QHeaderView::Stretch);//设置某列平均填满屏幕宽度
    ui->tableWidget_gzk->setColumnWidth(0,50);
    ui->tableWidget_gzk->setColumnWidth(1,100);
    ui->tableWidget_gzk->setColumnWidth(2,100);
    ui->tableWidget_gzk->setColumnWidth(3,100);
    ui->tableWidget_gzk->setColumnWidth(4,100);
    ui->tableWidget_gzk->setColumnWidth(5,200);
    ui->tableWidget_gzk->setColumnWidth(6,500);
    ui->tableWidget_gzk->setColumnWidth(7,100);
    ui->tableWidget_gzk->setColumnWidth(8,500);
    ui->tableWidget_gzk->setHorizontalHeaderLabels(QStringList{"序号","故障代码","故障原因","维修代码","故障诊断","故障现象/结论","维修指导","维修工具","维修说明"});//设置table列表各项标题
    ui->tableWidget_gzk->horizontalHeader()->setFont(QFont("SimHei", 13));

xxxx刷新表格,之后再执行下面的函数才有效
    ui->tableWidget_gzk->resizeRowsToContents();//自适应行高
    //for(int a=0;a<11;a++)
    //   ui->tableWidget_2->resizeColumnToContents(a);//重新设置每列宽度,最长自适应

qss

QTableView{
	alternate-background-color:rgb(255,255,255,20);
	background:rgb(255,255,255,40);
	color:white;
}
QHeaderView::section{
background-color:rgb(40,143,218);
font:13pt '宋体';
color: white;
	background-color: rgb(35, 43, 193);
}

QTableView::Item:Selected{
	alternate-background-color:rgb(255,255,255,20);
	background:rgb(255,255,255,40);
	color: rgb(0, 0, 255);
}

QScrollBar:vertical {
      border: none;
 	  background-color: rgba(255, 255, 255);
      width: 5px;
      margin: 0px 0 0px 0;
  }
 QScrollBar::handle:vertical {
	 border: none;
     border-radius:2px;
      background: rgba(154, 154, 154, 150);
      min-height: 15px;
  }
QScrollBar::sub-line:vertical {
      border: none;
      height: 0px;
      subcontrol-position: top;
      subcontrol-origin: margin;
  }
QScrollBar::add-line:vertical {
      border: none;
      height: 0px;
      subcontrol-position: bottom;
      subcontrol-origin: margin;
  }
  QScrollBar::up-arrow:vertical, QScrollBar::down-arrow:vertical {
	border:none;
      width: 0px;
      height: 0px;
  }
  QScrollBar::add-page:vertical, QScrollBar::sub-page:vertical {
      background: none;
  }

24.QCustomplot曲线模式通用界面及函数(随用随复制粘贴)

执行效果如下,实现方式看此贴

qt之常用简单、便捷方法记录(C++)_第1张图片

25.QCustomplot柱状模式通用界面及函数(随用随复制粘贴)

执行效果如下,实现方式看此贴

qt之常用简单、便捷方法记录(C++)_第2张图片

26.实现控件的振动效果

qt之常用简单、便捷方法记录(C++)_第3张图片gif掉帧,实际效果很不错

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

27.十六进制转浮点型数据

方法1:利用union巧妙转换,创建结构体

union packet
{
        float f;
        quint8 buf[4];
};

函数调用

        union packet data1;
        for(int a=0;a<4;a++)data1.buf[a]=rxdata[13+a];
        float have=data1.f;
        ui->label2->setText(QString("总容量%1M\r\n剩余容量%2M").arg(all).arg(have));

方法2:

 unsigned char s[4];
 //32位
 s[0]=0x4E;
 s[1]=0x62;
 s[2]=0x50;
 s[3]=0x40;
 float f2;
 memcpy_s(&f2 , sizeof(float) , s , 4);

28.高分辨率屏幕显示界面与ui保持一致

qt creator的ui界面普通解决办法:

int main(int argc, char *argv[])
{
    qputenv("QT_AUTO_SCREEN_SCALE_FACTOR", "1");//设置界面跟随UI中设计的一样,取物理尺寸,不取分辨率尺寸显示
    QApplication a(argc, argv);
    Sysin w;
    w.show();
    return a.exec();
}

qt+gtk+ui界面常规方法解决不了的办法

见帖子

29.阻塞线程延时,处理完之前在延时之后

    QCoreApplication::processEvents(QEventLoop::AllEvents, 100);//给100ms处理时间,处理完立马退出,未处理完超过100ms也退出
    QThread::msleep(200);//阻塞延时200ms

30.点击屏幕关闭窗口

this->setWindowFlags(Qt::FramelessWindowHint| Qt::Popup);//设置窗体无边框,Qt::Popup表明此窗口为最上层模态窗口,点击子窗口之外的位置都会自动隐藏,类似于菜单的效果。
//实现点击屏幕即关闭界面
//重写事件,捕获窗口失去焦点关闭界面
bool MessageBox5_3::event(QEvent *event)
{
    if (event->type() == QEvent::ActivationChange){
        if(QApplication::activeWindow() != this)//窗口失去焦点,关闭界面,Qt::Popup必须有
            this->close();
    }
    return QWidget::event(event);
}
//点击
void MessageBox5_3::mousePressEvent(QMouseEvent *event)
{
    this->close();
}

31.设置窗口置顶/无边框/去掉最大化最小化按键

   //this->setWindowFlags(Qt::FramelessWindowHint);//窗口无边框
    this->setWindowModality(Qt::ApplicationModal);//设置一直保持在顶端,不可切换其他界面,除非被新界面带此属性覆盖
    this->setWindowFlags(Qt::Dialog);//取消窗口最大化最小化按钮
当使用setWindowFlags时,属性要并列放在函数入口里才能同事生效,否则只有最后一个属性生效,如上面的如果把第一行打开,那么还是有边框的,因为属性被第三行替换,如果把第三行和第一行换顺序,那么只有无边框生效,虽然最大最小被隐藏了无所谓,但是其他属性时会失效,所以要并列设置,如下所示
    this->setWindowFlags(Qt::FramelessWindowHint|Qt::WindowStaysOnTopHint);//设置窗口无边框,设置窗口置顶,同时设置才能全部生效

32.平板电脑触摸事件识别

    this->setAttribute(Qt::WA_AcceptTouchEvents);

增加此句话,在平板电脑就可以接收触摸事件信号,window平板点击输入框可自动弹出键盘(待测试,猜测)参照链接

33.代替QProcess快速打开文件函数

QDesktopServices::openUrl(QUrl::fromLocalFile(path));

34.打开新ui界面,关闭时释放全部资源

使用ui多级时,有时会往复打开关闭某一个界面,这时候如果界面资源未被全部释放完毕,再次打开此界面会出现意想不到的问题导致界面崩溃、界面通讯失灵、界面操作无效等等,这是就要注意一些编程方式,从写程序上避免问题发生。

注意点1:新建ui时加入关闭界面释放资源函数

    System_check *check = new System_check();
    check->show();
    check->setAttribute(Qt::WA_DeleteOnClose);//若是关闭界面,则彻底释放资源

注意点2:在界面打开新的控件或通讯类时,在new时要指定控件归属

m_dapro = new Dataprocess(this);

Dataprocess为底层数据处理函数,无ui界面,调用此类就要指定属于this的子类,当this被关闭后,会自动释放Dataprocess占用的资源

serial = new QSerialPort(“COM1”,this);

通讯类函数同样,不指定归属,在界面关闭在进入后就会导致串口通讯失灵,要么就是数据会多次接收或发送。

35.通过控件名称快速定位到控件使用

this->findChild("label_pic_"+QString::number(id))->setPixmap(QPixmap::fromImage(*img_tmp[id-1]));
this->findChild("btn_picmax_"+QString::number(id))->setVisible(false);

你可能感兴趣的:(#,qt数据处理/算法类,qt简单便捷实用语法方法,qt,小秘诀,qt问题解决汇总,c++,编程语言)