QT笔记

一.Qwidget绘制带弧线的背景

1. 重新实现paintEvent

作为独立窗口的时候需要先设置窗口参数,如果有父对象则不需要

SubFram::SubFram(QWidget *parent):QWidget(parent,Qt::FramelessWindowHint)
{
this->setAttribute(Qt::WA_TranslucentBackground);
m_Color=QColor(22,22,22);
}
protected:
    void paintEvent(QPaintEvent *event);
void SubFram::paintEvent(QPaintEvent *event)
{
    Q_UNUSED(event);
    QPainter painter(this);
    painter.setRenderHint(QPainter::Antialiasing);    //解决绘图有锯齿
    QPen pen;
    pen.setColor(m_Color);
    QBrush brush(m_Color);
    painter.setBrush(brush);
    painter.setPen(pen);  //边框色
    painter.drawRoundedRect(this->rect(), 5, 5); //圆角5像素
}

二.QTableView一些常用参数设置

1.表头设置

	m_tableView=new QTableView;
	m_tableView->setEditTriggers(QAbstractItemView::NoEditTriggers);//无法编辑
    m_tableView->setSelectionBehavior(QAbstractItemView::SelectRows);//选中的时候选中一整行
    QHeaderView *H_head=new QHeaderView(Qt::Horizontal);//重新定义表头.
    QString Headsty=QStringLiteral("QHeaderView::section { color: rgb(163,165,165);background-color :rgb(51,51,51);}");//表头样式
    H_head->setStyleSheet(Headsty);
    H_head->setFont(ft);
    //H_head->setStretchLastSection(true); //行头自适应表格
    H_head->setSectionResizeMode(QHeaderView::Stretch);//自动适应表项宽度
    m_tableView->setHorizontalHeader(H_head);//设置表头
	//m_tableView->verticalHeader();//获取垂直表头
	//m_tableView->horizontalHeader();//获取水平表头
	//m_tableView->verticalHeader()->hide();//隐藏垂直表头
	//m_tableView->horizontalHeader()->hide();//隐藏水平表头
	//m_tableView->setColumnWidth(0,60);//根据索引设置表项宽度,表头设置自动适应宽度就不会起作用

2.设置垂直滑动条

QString styRegstr="QScrollBar:vertical{width:50px;background:transparent;background-color:rgb(51, 51, 51);margin:0px,0px,0px,0px;padding-top:25px;padding-bottom:25px;}"
                      "QScrollBar::handle:vertical{width:10px;background:lightgray ;border-radius:5px;min-height:20px;}"
                      "QScrollBar::handle:vertical:hover{width:10px;background:gray;border-radius:5px;min-height:20px;}"
                      "QScrollBar::add-line:vertical{height:30px;width:50px;border-image:url(:/images/BtnBottom.png);subcontrol-position:bottom;}"
                      "QScrollBar::sub-line:vertical{height:30px;width:50px;border-image:url(:/images/BtnTop.png);subcontrol-position:top;}"
                      "QScrollBar::add-line:vertical:hover{height:30px;width:50px;border-image:url(:/images/BtnBottom.png);subcontrol-position:bottom;}"
                      "QScrollBar::sub-line:vertical:hover{height:30px;width:50px;border-image:url(:/images/BtnTop.png);subcontrol-position:top;}"
                      "QScrollBar::add-page:vertical,QScrollBar::sub-page:vertical{background:transparent;border-radius:5px;}";
m_tableView->verticalScrollBar()->setStyleSheet(styRegstr);

3.设置各行表项的颜色,通过自定义模型data函数返回数据来判断

QVariant CustomModel::data(const QModelIndex &index, int role) const
{
    if(!index.isValid()){
        return QVariant();
    }
    int rowCount=index.row();
    int columnCount=index.column();
	if(role == Qt::BackgroundColorRole )
        {
            if(rowCount%2== 0)
                return QColor(35,35,35);
            else if(rowCount%2 == 1)
                return QColor(22,22,22);
            else
                return QVariant();
        }
}

三.QPushButton常用的样式设置

1.设置字体颜色和背景

//color:rgb(163,165,165)设置字体颜色
//border-image:url(:/images/Alarm_Right1.svg)设置背景图片
m_btnReal=new QPushButton;
m_btnReal->setStyleSheet(QStringLiteral("QPushButton{color:rgb(163,165,165);border-image:url(:/images/Alarm_Right1.svg);}"));

2.设置点击和改变背景 再点击变回来

//color:rgb(163,165,165)设置字体颜色
//border-image:url(:/images/Alarm_Right1.svg)设置背景图片
//QPushButton:!checked{border-image:url(:/images/Alarm_Left1.svg)//非点击状态,即m_btnReal->isChecked();}等于false
//QPushButton:checked{border-image:url(:/images/Alarm_Left2.svg);}//非=点击状态,即m_btnReal->isChecked();}等于true
m_btnReal=new QPushButton;
m_btnHistory->setCheckable(true);//需要先打开这个功能
m_btnReal->setStyleSheet(QStringLiteral("QPushButton{color:rgb(163,165,165);}QPushButton:!checked{border-image:url(:/images/Alarm_Left1.svg);}QPushButton:checked{border-image:url(:/images/Alarm_Left2.svg);}"));

四.QRadioButton样式设置

链接: 原文

1.样式设置

//单选框,圆圈部分

QRadioButton::indicator{
width:32px;
height:18px;
image: url(./image1.png);
position:relative;//通过该参数可以修改图片位置:left,right…
left:0px;
right:0px;
top:0px;
bottom:0px;
}
//单选框动态样式
QRadioButton::indicator:hover{
Image:url(./image2.png);
}
QRadioButton::indicator:pressed{
Image:url(./image2.png);
}
//根据是否选中状态的动态样式(unchecked和没有添加任何状态时的样式是相同)
QRadioButton::indicator: unchecked{
Image:url(./image2.png);
}
QRadioButton::indicator:unchecked:hover{
Image:url(./image2.png);
}
QRadioButton::indicator:unchecked: pressed{
Image:url(./image2.png);
}
QRadioButton::indicator: checked{
Image:url(./image2.png);
}
QRadioButton::indicator: checked:hover{
Image:url(./image2.png);
}
QRadioButton::indicator: checked: pressed{
Image:url(./image2.png);
}

3.简单使用

 	QRadioButton *m_radOffStorage=new QRadioButton;
 	QRadioButton *m_radOnStorage=new QRadioButton;
    QButtonGroup *BtngroupStorsge=new QButtonGroup(this);
    BtngroupStorsge->addButton(m_radOffStorage,0);
    BtngroupStorsge->addButton(m_radOnStorage,1);
    BtngroupScreen->setObjectName("3");
    connect(BtngroupStorsge,static_cast<void(QButtonGroup::*)(int)>(&QButtonGroup::buttonClicked),this,&SysSet::slots_RadioGroupChange);

//槽函数

void SysSet::slots_RadioGroupChange(int id)
{
    int Number=dynamic_cast<QButtonGroup *>(sender())->objectName().toUInt();
    bool valBool=false;
    if(id==0){
        valBool=false;
    }else{
        valBool=true;
    }
    switch (Number) {
    case 1:
        proConfig.m_boolTrise=valBool;
        break;
    case 2:
        proConfig.m_boolAlamVoice=valBool;
        break;
    case 3:
        proConfig.m_boolScreen=valBool;
        break;
    case 4:
        proConfig.m_boolStorage=valBool;
        break;
    default:
        break;
    }
}

五.QCheckBox样式设置

链接: 原文

1.开启三态模式。构造一个复选框QCheckBox,然后使用setTristate()

QCheckBox *pCheckBox = new QCheckBox(this);
m_pLabel = new QLabel(this);
m_pLabel->setText("Click CheckBox...");
pCheckBox->setText(QString::fromLocal8Bit("三态复选框"));
// 开启三态模式
pCheckBox->setTristate();  
// 连接信号槽
connect(pCheckBox, SIGNAL(stateChanged(int)), this, SLOT(onStateChanged(int)));
槽函数,判断当前复选框状态,其中包括:选中(Qt::Checked)、半选(Qt::PartiallyChecked)、未选中(Qt::Unchecked)。

槽函数

void MainWindow::onStateChanged(int state)
{
    if (state == Qt::Checked) // "选中"
    {
        m_pLabel->setText("Checked");
    }
    else if(state == Qt::PartiallyChecked) // "半选"
    {
        m_pLabel->setText("PartiallyChecked");
    }
    else // 未选中 - Qt::Unchecked
    {
        m_pLabel->setText("Unchecked");
    }
}

2.QSS复选框样式。

QCheckBox{
        spacing: 5px;
        color: white;
}
QCheckBox::indicator {
        width: 17px;
        height: 17px;
}
QCheckBox::indicator:enabled:unchecked {
        image: url(:/Images/checkBox);
}
QCheckBox::indicator:enabled:unchecked:hover {
        image: url(:/Images/checkBoxHover);
}
QCheckBox::indicator:enabled:unchecked:pressed {
        image: url(:/Images/checkBoxPressed);
}
QCheckBox::indicator:enabled:checked {
        image: url(:/Images/checkBoxChecked);
}
QCheckBox::indicator:enabled:checked:hover {
        image: url(:/Images/checkBoxCheckedHover);
}
QCheckBox::indicator:enabled:checked:pressed {
        image: url(:/Images/checkBoxCheckedPressed);
}
QCheckBox::indicator:enabled:indeterminate {
        image: url(:/Images/checkBoxIndeterminate);
}
QCheckBox::indicator:enabled:indeterminate:hover {
        image: url(:/Images/checkBoxIndeterminateHover);
}
QCheckBox::indicator:enabled:indeterminate:pressed {
        image: url(:/Images/checkBoxIndeterminatePressed);
}

六.QProcess一些使用方法

更多详细内容参考1:如何用QProcess快速实现外部程序调用

1.QProcess类及接口介绍

QProcess类是Qt中专门用于启动一个外部程序进程并与主程序通信的。此类中包含多个静态函数和信号,可以方便地通过信号与槽机制实现信息互通。

我们要实现快速调用外部程序,常用的有三个接口函数:

QProcess::execute(): 此函数是以阻塞的方式打开外部程序,只有外部程序执行完成后,主程序才会继续执行。外部程序的标准输出、标准错误都是重定向到主程序的标准输出和标准错误的。
QProcess::start(): 此函数是以子进程的 方式打开外部程序的,外部进程与主程序互不干扰,但外部进程的父进程就是主程序。
QProcess::startDetached(): 此函数是以分离的方式打开外部程序的,外部程序与主程序互不干扰,外部进程的父进程是系统的init进程。
上面三个接口函数中,execute()和startDetached()为静态成员函数,start()函数为普通成员函数。 另外,值得注意的是,使用start() 函数打开外部进程时,外部进程启动后,将随主程序的退出而退出,使用回调即可以正常接收信息;使用startDetached() 函数打开外部进程时,外部进程启动后,不会随主程序的退出而退出,使用回调无法正常接收到信息。

在QT程序中我们经常需要与其他的程序间进行交互,而与终端进行交互就是一个例子。在不需要获取返回信息的情况下我们可以直接使用”system()”函数执行,但是当需要获取执行的结果或者需要实时地将结果输出到窗口上时,就比较难办了,需要涉及进程管道等等。而QT提供的QProcess类则大大简化了这一过程。

2.简单使用案例

更多详细内容参考2:QT通过QProcess执行终端命令并实时输出回显
QProcess是QT提供的与外部程序进行交互的一个类,主要使用到以下的函数:

start();     //启动一个进程
kill();         //关闭启动的外部进程
write();     //向外部进程写入数据
readAllStandardOutput();     //读取外部进程的标准输出
readAllStandardError();        //读取外部进程的错误信息

创建QProcess对象并连接信号与槽

cmd = new QProcess(this);
connect(cmd , SIGNAL(readyReadStandardOutput()) , this , SLOT(on_readoutput()));
connect(cmd , SIGNAL(readyReadStandardError()) , this , SLOT(on_readerror()));

实现槽函数
接收到标准输出:

void MainWindow::on_readoutput()
{
    ui->textEdit->append(cmd->readAllStandardOutput().data());   //将输出信息读取到编辑框
}

接收到错误信息:

void MainWindow::on_readerror()
{
    QMessageBox::information(0, "Error", cmd->readAllStandardError().data());    //弹出信息框提示错误信息
}

3.实用做法

QProcess::start(): 此函数是以子进程的 方式打开外部程序的,外部进程与主程序互不干扰,但外部进程的父进程就是主程序。

    QProcess CmdPro;
    QString StrCmd=QString("wpa_cli -i wlan0 scan");
    CmdPro.start(StrCmd);
    /*这个启动判断根据情况加,一般不需要,下面的判断可以满足
    if (!CmdPro->waitForStarted()){
        qDebug() << "启动失败";
    }*/
    CmdPro.waitForReadyRead(50);//等输出数据流,如果提前输出则提前结束等待
    QString StrResults=CmdPro.readAllStandardOutput();//读取回显示
    QString StrError=CmdPro.readAllStandardError();//读取错误信息
    qDebug()<<"Results1"<<StrResults<<StrError<<endl;
    if(!StrResults.startsWith("OK")){

        CmdPro.close();
        QVector<_WifiInfor> ret;
        return ret;
    }
    CmdPro.close();//每个指令执行完要执行一次colse,不然对象被析构的时候提示异常以及无法继续使用下一条指令
    StrCmd=QString("wpa_cli -i wlan0 scan_results");
    CmdPro.start(StrCmd);
    CmdPro.waitForReadyRead(50);
    StrResults=CmdPro.readAllStandardOutput();
    StrError=CmdPro.readAllStandardError();
    qDebug()<<"Results2"<<StrResults<<StrError<<endl;
    if(!StrResults.startsWith("bssid")){
        CmdPro.close();
        QVector<_WifiInfor> ret;
        return ret;
    }

输出结果

Results1 "OK\n" "" 

Results2 "bssid / frequency / signal level / flags / ssid\n78:a3:51:3e:10:d0\t2437\t-59\t[WPA2-PSK-CCMP][ESS]\tzhanting\n8c:fd:18:6b:01:80\t2462\t-57\t[WPA-PSK-CCMP][WPA2-PSK-CCMP][ESS]\tHUAWEI-0180\nca:50:e9:a3:8d:1e\t2412\t-59\t[WPA-PSK-CCMP+TKIP][WPA2-PSK-CCMP+TKIP][ESS]\tChinaNet-MqOC\n54:75:95:00:be:94\t2462\t-60\t[WPA-PSK-CCMP][WPA2-PSK-CCMP][ESS]\tTOPRIE_AP3\nf0:92:b4:29:90:79\t2417\t-57\t[WPA-PSK-CCMP+TKIP][WPA2-PSK-CCMP+TKIP][WPS][ESS]\tChinaNet-ZEGH\n54:75:95:00:be:93\t2462\t-62\t[WPA-PSK-CCMP][WPA2-PSK-CCMP][ESS]\tTOPRIE_AP2\nb0:95:8e:4d:ac:a9\t2417\t-69\t[WPA-PSK-CCMP+TKIP][WPA2-PSK-CCMP+TKIP][ESS]\tntek-b1\n78:96:82:ab:df:98\t2412\t-67\t[WPA-PSK-CCMP+TKIP][WPA2-PSK-CCMP+TKIP][WPS][ESS]\tOMT\n8c:a6:df:10:7d:97\t2437\t-67\t[WPA-PSK-CCMP][WPA2-PSK-CCMP][ESS]\tOulu-SmartHome\n54:75:95:00:d6:bf\t2412\t-70\t[WPA-PSK-CCMP+TKIP][WPA2-PSK-CCMP+TKIP][ESS]\tLivingLabChina\n0c:72:2c:51:d2:ae\t2412\t-71\t[WPS][ESS]\tTP-LINK_51D2AE\n5a:fb:84:01:1b:07\t2412\t-60\t[WPA2-PSK-CCMP][WPS][ESS]\tliubo\nf4:bf:80:32:df:80\t2437\t-68\t[WPA-PSK-CCMP][WPA2-PSK-CCMP][WPS][ESS]\t508\n28:6c:07:ea:ac:67\t2412\t-73\t[WPA-PSK-CCMP+TKIP][WPA2-PSK-CCMP+TKIP][WPS][ESS]\tXiaomi_AC66\n0c:4b:54:da:d1:7f\t2462\t-62\t[WPA-PSK-CCMP][WPA2-PSK-CCMP][ESS]\tszfjj\n78:44:fd:0d:a1:8a\t2412\t-71\t[WPA-PSK-CCMP+TKIP][WPA2-PSK-CCMP+TKIP][ESS]\ttimu\n30:a1:fa:aa:7d:20\t2412\t-67\t[WPA-PSK-CCMP][WPA2-PSK-CCMP][WPS][ESS]\tCindou505\n0c:ef:af:d2:b6:70\t2412\t-72\t[WPA-PSK-CCMP][ESS]\t\n0c:ef:af:d2:b7:2c\t2412\t-71\t[WPA-PSK-CCMP][ESS]\t\n30:a1:fa:aa:7d:21\t2412\t-66\t[WPA2-PSK-CCMP][ESS]\t\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\n54:75:95:00:be:8f\t2437\t-67\t[WPA-PSK-CCMP][WPA2-PSK-CCMP][ESS]\t378416568\n0c:ef:af:d2:cd:fe\t2412\t-73\t[WPA-PSK-CCMP][ESS]\t\nf4:bf:80:32:df:81\t2437\t-69\t[WPA2-PSK-CCMP][ESS]\t\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\n56:a7:03:a7:17:27\t2412\t-71\t[WPA-PSK-CCMP][WPA2-PSK-CCMP][ESS]\t\n54:a7:03:b7:17:27\t2412\t-72\t[WPA-PSK-CCMP][WPA2-PSK-CCMP][WPS][ESS]\t\nf4:bf:80:32:df:85\t2437\t-69\t[WPA2-PSK-CCMP][ESS]\t\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\nd8:32:14:29:e6:38\t2462\t-67\t[WPA-PSK-CCMP][WPA2-PSK-CCMP][WPS][ESS]\tOMT2\n78:44:fd:71:cd:29\t2412\t-73\t[WPA-PSK-CCMP][WPA2-PSK-CCMP][ESS]\tDNC\n0c:ef:af:d2:ce:a4\t2412\t-73\t[WPA-PSK-CCMP][ESS]\t\n0c:ef:af:d2:cd:7e\t2412\t-73\t[WPA-PSK-CCMP][ESS]\t\n1c:68:7e:6f:cc:6e\t2412\t-71\t[WPA-PSK-CCMP][WPA2-PSK-CCMP][WPS][ESS]\t501\nc8:ee:a6:3c:24:96\t2422\t-70\t[WPA-PSK-CCMP][WPA2-PSK-CCMP][ESS]\tsk419\n0c:ef:af:d2:0e:b0\t2437\t-72\t[WPA-PSK-CCMP][ESS]\t\n54:75:95:00:d6:bd\t2462\t-72\t[WPA-PSK-CCMP+TKIP][WPA2-PSK-CCMP+TKIP][ESS]\tLivingLabChina\ne4:72:e2:00:1f:28\t2457\t-66\t[WPA-PSK-CCMP+TKIP][WPA2-PSK-CCMP+TKIP][WPS][ESS]\tChinaNet-4fbT\nc0:9f:e1:68:71:a8\t2447\t-68\t[WPA-PSK-CCMP+TKIP][WPA2-PSK-CCMP+TKIP][ESS]\tChinaNet-nPrF\ne8:c4:17:da:b7:ed\t2412\t-72\t[WPA-PSK-CCMP][WPA2-PSK-CCMP][ESS]\tChinaNet-3F7y\nf4:83:cd:6e:26:2c\t2462\t-72\t[WPA-PSK-CCMP][WPA2-PSK-CCMP][ESS]\t\n80:8f:1d:ea:3f:86\t2442\t-71\t[WPA-PSK-CCMP+TKIP][WPA2-PSK-CCMP+TKIP][ESS]\tBCBZ-B1\n8c:a6:df:21:59:08\t2462\t-73\t[WPA-PSK-CCMP][WPA2-PSK-CCMP][ESS]\t403\n60:3a:7c:4a:b5:91\t2462\t-72\t[WPA-PSK-CCMP][WPA2-PSK-CCMP][WPS][ESS]\tTP-LINK_B591\n34:2e:b6:74:01:90\t2437\t-70\t[WPA2-PSK-CCMP][ESS]\tHUAWEI Mate 20\nc8:3a:35:ae:88:41\t2432\t-72\t[WPA-PSK-CCMP][WPA2-PSK-CCMP][ESS]\tBCYNX\nd8:32:14:4d:e2:38\t2422\t-72\t[WPA-PSK-CCMP][WPA2-PSK-CCMP][WPS][ESS]\tsk308\nb0:41:1d:64:dc:0f\t2462\t-73\t[WPA2-PSK-CCMP][ESS]\tEASYLINKIN-2\nd8:32:14:4e:06:88\t2417\t-73\t[WPA-PSK-CCMP][WPA2-PSK-CCMP][WPS][ESS]\t1402\n0c:ef:af:d2:96:f2\t2437\t-72\t[WPA-PSK-CCMP][ESS]\t\n78:44:fd:48:d0:c2\t2412\t-73\t[WPA-PSK-CCMP][WPA2-PSK-CCMP][ESS]\t\n1c:68:7e:62:33:b0\t2462\t-73\t[WPA-PSK-CCMP][WPA2-PSK-CCMP][WPS][ESS]\tiereative\n62:3a:7c:2a:b5:91\t2462\t-73\t[WPA-PSK-CCMP][WPA2-PSK-CCMP][ESS]\t\nf0:92:b4:85:63:09\t2412\t-73\t[WPA-PSK-CCMP+TKIP][WPA2-PSK-CCMP+TKIP][ESS]\tChinaNet-ddm4\n80:8f:1d:4c:84:23\t2437\t-73\t[WPA-PSK-CCMP+TKIP][WPA2-PSK-CCMP+TKIP][ESS]\ttyoffice_2.4\n00:bd:82:49:98:9a\t2442\t-73\t[WPA-PSK-CCMP+TKIP][WPA2-PSK-CCMP+TKIP][WPS][ESS]\tChinaNet-kmLJ\ncc:08:fb:a1:ae:89\t2442\t-73\t[WPA-PSK-CCMP+TKIP][WPA2-PSK-CCMP+TKIP][ESS]\tntek-c2\n" "" 

七.QString使用方法

更多信息参考:QT中QString 类的使用–获取指定字符位置

1、获取字符串某位置的值。

QString中有没有函数能截取出两个指定位置之间的字符串?
QString x = “Nine pineapples”;
QString y = x.mid(5, 4); // y == “pine”
QString z = x.mid(5); // z == “pineapples”

1、mid()函数接受两个参数,第一个是起始位置,第二个是取串的长度。如果省略第二个参数,则会从起始位置截取到末尾。正如上面的例子显示的那样

2、函数left()和rigt()类似,都接受一个int类型的参数n,都是对字符串进行截取。不同之处在于,left()函数从左侧截取n个字符,而right()从右侧开始截取。下面是left()的例子:

  1. QString x = “Pineapple”;
  2. QString y = x.left(4); // y == “Pine”

2.、获取字符在字符中的位置。

indexOf()//从索引位置开始获取 字符串第一次出现的索引。从左到右
lastIndexOf()函数,返回字符串的最后一次出现的索引,默认索引参数-1表示从最后一个字符开始索引,从右到左,但是返回的索引值是从左到右计算的
QString x = “sticky question”;
QString y = “sti”;
x.indexOf(y); // returns 0
x.indexOf(y, 1); // returns 10
x.indexOf(y, 10); // returns 10
x.indexOf(y, 11); // returns -1

3可以检测字符串是不是以某个特定的串开始或结尾。

startsWith()
endsWith()
if (url.startsWith(" http:")&& url.endsWith(".png"))
{ }
这段代码等价于
if (url.left(5) == " http:" && url.right(4) == " .png")
{ }

4、清除空格,换行符等

字符串替换函数replace();
trimmed()函数去除字符串两侧的空白字符(注意,空白字符包括空格、Tab以及换行符,而不仅仅是空格);
toLower()和toUpper()函数会将字符串转换成小写大写字符串;
remove()和 insert()函数提供了删除和插入字符串的能力;
simplified()函数可以将串中的所有连续的空白字符替换成一个,并且把两端的空白字符去除,例如" \t ”会返回一个空格" "。

5.格式化输出字符串

QString Str=QString("%1").arg("tt",4,QLatin1Char(0))
Str="00tt"

6.替换指定字符串

    QString  StrSrc="jQaQkQgQkQagjl";
    qDebug()<<"StrSrc"<<StrSrc.replace("Q","");

    QString  StrSrc2="jQaQkQgQkQagjl";
    qDebug()<<"StrSrc2"<<StrSrc2.remove("Q");

输出结果

StrSrc "jakgkagjl"
StrSrc2 "jakgkagjl"

7.16进制字符串转16进制 QByteArray

//字符串16进制转QByteArray

    QString StrSrc0="你好";
    qDebug()<<"StrSrc0"<<StrSrc0.toUtf8().toHex();

    QString StrSrc1="e4bda0e5a5bd";
    QByteArray ByteSrc=QByteArray::fromHex(StrSrc1.toUtf8());
    qDebug()<<"StrSrc1"<<ByteSrc.toHex();
    QString StrEnd=ByteSrc;
    qDebug()<<"StrEnd"<<StrEnd;

输出结果

StrSrc0 "e4bda0e5a5bd"
StrSrc1 "e4bda0e5a5bd"
StrEnd "你好"

//QByteArray转16进制字符串

    QString StrSrc3="你好";
    QByteArray ByteA=StrSrc3.toUtf8();
    QString StrHex=ByteA.toHex();
    qDebug()<<"StrHex"<<StrHex;

输出结果

StrHex "e4bda0e5a5bd"

八.Qt编码转换

Qt里面基本只用的到其他编码转Unicode的,QT内部默认是Unicode编码,所以其他编码要在Qt显示就要转换成Unicode的,同样的如果Qt的Unicode编码要在其他地方显示就要Unicode转其他编码

1.GBK 转Unicode,这样QT可以正常显示中文

编码的一些知识: 编码(ACSII unicod UTF-8)、QT输出中文乱码深入分析
编码查询:编码查询

 //给tc指定编码的解码器为GBK,那么tc就是GBK编码的,
 //调用函数toUnicode吧RecByteReg的GBK编码转换为Unicode编码的dataStr
QByteArray RecByteReg;
QTextCodec *tc = QTextCodec::codecForName("GBK");
QString dataStr=tc->toUnicode(RecByteReg);
m_String+=dataStr+"\r\n";

2.Unicode 转GBK,这样QT可以正常显示中文

QString SrcStr;
QTextCodec *tc = QTextCodec::codecForName("GBK");
QByteArray dataByte=tc->fromUnicode(SrcStr)

3.Qt内部的编码修改

将编码改成UTF-8的

//获取当前编码
//QString SysCurrCodec=QTextCodec::codecForLocale()->name();
//搜索所有安装的QTextCodec对象,并返回最匹配的名称;匹配不区分大小写。如果找不到与名称名称匹配的编解码器,则返回0。
QTextCodec *codec = QTextCodec::codecForName("UTF-8");
//设置编码
QTextCodec::setCodecForLocale(codec);

九.QTextEdit一些使用

1.限制输入,只能输入16进制字符和空格

文本少的时候可以没问题,文本多了遍历字符应该会卡死界面

//连接槽函数
connect(ui->textEdt_sendText,&QTextEdit::textChanged,this,&MainWindow::slots_textEdt_sendText);

槽函数处理

void MainWindow::slots_textEdt_sendText()
{
//判断是否需要做16进制处理
    if(m_PortPmt.check_HexSend==true)
    {
        QtextBrowInputHex(ui->textEdt_sendText);
    }
}

void QtextBrowInputHex(QTextEdit *Widget)函数 用来设置光标位置

void QtextBrowInputHex(QTextEdit *Widget)
{
    QTextCursor Coursor=Widget->textCursor();
    int index=Coursor.position();//最后一次输入点的光标位置
    int lastLen=Widget->toPlainText().count();
    QString Text=StringAndHexStrMate(Widget->toPlainText());
    Widget->blockSignals(true);
    Widget->clear();
    Widget->setText(Text);
    Widget->blockSignals(false);
    if(!Text.isEmpty())
    {
        int len=Text.count();
        /*lastLen最后一次输入时的字符数目 len处理后的字符数目
         * 正常输入和回车,del的时候diff是零,当比如erf被同时输入,在中午输入下输erf回车会出现这种情况
         * erf中只有ef满足,这时diff是1
         * */
        int diff=lastLen-len;
        qDebug()<<diff<<index<<index-diff<<lastLen;
        //移动到新的光标位置
        Coursor.setPosition(index-diff,QTextCursor::MoveAnchor);
        Widget->setTextCursor(Coursor);
    }
}

QString StringAndHexStrMate(QString recString)函数 用来筛选16进制字符

QString StringAndHexStrMate(QString recString)
{
    //判断输入是否满足16进制
    QByteArray textbyte=recString.toLocal8Bit();
    QByteArray retByte;
    for(int i=0;i<textbyte.size();i++)
    {
    //判断满足条件
        if((textbyte.at(i)>='a'&&textbyte.at(i)<='f')||(textbyte.at(i)>='A'&&textbyte.at(i)<='F')||(textbyte.at(i)>='0'&&textbyte.at(i)<='9')||textbyte.at(i)==' ')
        {
            retByte.append(textbyte.at(i));
        }
    }
    if(retByte.count()==0)
    {
        return QString("");
    }
    else
    {
        QString retStr=retByte;
        return retStr;
    }
    return QString("");
}

10.QlineEdit一些设置

1.编辑模式

ui->lineEdit->setReadOnly(true);//设置不可编辑
©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页