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()的例子:
- QString x = “Pineapple”;
- 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”
十三.读写二进制文件
十四.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的随机数