QT笔记

QT常用的一些语法

QT打包脚本

echo Setting up environment for Qt usage...
set PATH=D:\Qt\5.14.1\mingw73_32\bin;D:/Qt/5.14.1/mingw73_32/bin;%PATH%
rem 声明变量并赋值当前路径值
set FolderName=%~dp0
rem 使用变量
windeployqt %FolderName%

一.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);//根据索引设置表项宽度,表头设置自动适应宽度就不会起作用
//根据内容自动调整某列的列宽
void QTableView::resizeColumnToContents ( int column ) [slot]
//根据内容自动调整所有列的列宽
void QTableView::resizeColumnsToContents () [slot]
//根据内容自动调整某一行的行高
void QTableView::resizeRowToContents ( int row ) [slot]
//根据内容自动调整所有行的行高。
void QTableView::resizeRowsToContents () [slot]

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快速实现外部程序调用

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"

8.某个字符在字符串中出现的次数

 //字符在字符串出现的次数,不会重叠,比如“XXXX.XX”,执行count(‘X’)会计算出来6个
int QString::count(QChar ch, Qt::CaseSensitivity cs = Qt::CaseSensitive) const
//字符串在字符串中出现的次数,测试发现这种是会有重叠的,比如“XXXX.XX”,执行count("XX")会计算出来4个
int QString::count(const QStringRef &str, Qt::CaseSensitivity cs = Qt::CaseSensitive) const
参数 Qt::CaseSensitivity cs;是否区分大小写 默认是区分

八.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("");
}

十.QlineEdit一些设置

1.编辑模式

ui->lineEdit->setReadOnly(true);//设置不可编辑

2.设置输入限值(如只能输入16进制)

	//只能输入整数
	m_editPort->setValidator(new QIntValidator(0,65535,this));
	//只能输入浮点型,小数点后五位
	m_editFloatVal->setValidator(new QDoubleValidator(-999999999.0,999999999.0,5,this));
	//只能输入16进制字符,而且只能输入8位
    QRegExp regExp("[a-fA-F0-9][a-fA-F0-9]{0,7}");
    QValidator *validator = new QRegExpValidator(regExp,this);
    m_editHex32->setValidator(validator);

十一.Qt 获取系统时间 日期时间格式

一、示例代码

QDateTime local(QDateTime::currentDateTime());
QString localTime = local.toString("yyyy-MM-dd:hh:mm:ss");
qDebug() << localTime;
输出结果:"2017-03-17 09:25:58"

如果只需要时间,不需要日期则可以使用QTime

二、时间日期格式

1、日期格式

d - 没有前置0的数字的天(1-31)
dd - 前置0的数字的天(01-31)
ddd - 缩写的日名称(Mon-Sun)。使用QDate::shortDayName()。
dddd - 长的日名称(Monday-Sunday)。使用QDate::longDayName()。
M - 没有前置0的数字的月(1-12)
MM - 前置0的数字的月(01-12)
MMM - 缩写的月名称(Jan-Dec)。使用QDate::shortMonthName()。
MMMM - 长的月名称(January-December)。使用QDate::longMonthName()。
yy - 两位数字的年(00-99)
yyyy - 四位数字的年(0000-9999)

2、时间格式

h - 没有前置0的数字的小时(0-23或者如果显示AM/PM时,1-12)
hh - 前置0的数字的小时(00-23或者如果显示AM/PM时,01-12)
m - 没有前置0的数字的分钟(0-59)
mm - 前置0的数字的分钟(00-59)
s - 没有前置0的数字的秒(0-59)
ss - 前置0的数字的秒(00-59)
z - 没有前置0的数字的毫秒(0-999)
zzz - 前置0的数字的毫秒(000-999)
AP - 切换为AM/PM显示。AP将被“AM”或“PM”替换。
ap - 切换为am/pm显示。ap将被“am”或“pm”替换。

3、格式字符串实例(假设这个QDateTime为2001年5月21日14:13:09)

“dd.MM.yyyy”的结果将是“21.05.2001”
“ddd MMMM d yy”的结果将是“Tue May 21 01”
“hh:mm:ss.zzz”的结果将是“14:13:09.042”
“h: m:s ap”的结果将是“2:13:9 pm”

十三.读写二进制文件

Qt 学习 之 二进制文件读写

十四.Qt4使用QSerialport

参考网站:linux下给qt4安装QSerialPort
QSeriaport源码QSeriaport源码

十五.产生一定范围的随机数

qsrand(QTime(0, 0, 0).secsTo(QTime::currentTime()));//设置随机种子
int num = qrand()%(500-300)+300;//产生300-500范围的随机岁
float data=num/10.0;//除以10获取 30.0到50.0的随机数
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值