一、警告\错误处理
1、汉字显示乱码\警告C4819:该文件包含不能在当前代码页(936)中标识的字符
工具-选项-行为-文件编码,默认编码选择utf-8,utf-8 BOM 选择 “如果编码是utf-8则添加”,文件头添加语句 #pragma execution_character_set("utf-8")
2、对象被多次指定
pro文件中多次添加同意文件,pro中删除多次添加的文件,执行qmake后重新构建
二、数据类型转换
1、带汉字的Qstring 转 char*
//解决汉字乱码问题
QTextCodec::setCodecForLocale(QTextCodec::codecForName("GBK"));
//转换步骤
char *fwchar = NULL;
QByteArray ba_fw = QString fw_version.toLocal8Bit(); \\ QString转QByteArray
| fwchar = (char *)malloc(ba_fw.length() + 1); \\ char* 分配空间 |
| memcpy(fwchar, ba_fw.data(), ba_fw.length());\\ QByteArray复制到char* |
| fwchar[ba_fw.length()] = '\0'; |
2、QString 转 int,随意进制
Int = QString.toInt(nullptr, 16); \\ 数字代表进制,16, 10 ,8 等
3、QString 转 LPCWSTR
Std::wstring = Qstring.toStdWString();
LPCWSTR = Std::wstring.c_str();
4、//TCHAR 2 QString
str = QString::fromWCharArray(acDevPath[i]);
5、// QString to LPCWSTR
wstr_fileName = fileName.toStdWString();
6、//QString to long
offset_onLine = offset_in.toLong();
三、ListWidget 控件应用
1、信号/槽
单击选择\双击选择
2、选择模式控制
ui->listWidget->setSelectionMode(QAbstractItemView::ExtendedSelection);// CTRL或SHIFT时可实现多选
public:
enum SelectionMode {
NoSelection, |
|
| 不能选中 |
SingleSelection, |
|
| 只能单选 |
MultiSelection, |
|
| 只能多选 |
ExtendedSelection, |
|
| CTRL或SHIFT时可实现多选 |
ContiguousSelection |
|
| 选一片,连续选择 |
};
Q_ENUM(SelectionMode)
//ListWidget 多选模式获取行号和所选行内容
void MainWindow::choice_Device()
{
QList<QListWidgetItem*>items=ui->listWidget->selectedItems();
count=items.count();
ui->textBrowser->append("count = " + QString::number(count));
if(count == 0) {
QMessageBox mesg;
mesg.warning(this, "warning!", "未选择设备!");
return;
}
for(int i=0;i< count;i++)
{
currenRow[i] = ui->listWidget->row(items.at(i));//获取选中的行
ui->textBrowser->append(tr("currenRow[%1] = %2").arg(i) .arg(currenRow[i]));
QListWidgetItem*item=items.at(i);
QString name=item->text();//获取内容
ui->textBrowser->append(name);
}
}
3、TableWidget控件
//设置列数
ui->tableWidget->setColumnCount(1);
//设置行数
ui->tableWidget->setRowCount(16);
//设置默认部分大小
ui->tableWidget->horizontalHeader()->setDefaultSectionSize(150);
//设置行填充
ui->tableWidget->horizontalHeader()->setStretchLastSection(true);
//设置表头不可被选中
ui->tableWidget->horizontalHeader()->setSectionsClickable(false);
//消除表格控件的边框
ui->tableWidget->setFrameShape(QFrame::NoFrame);
//不显示网格
ui->tableWidget->setShowGrid(true);
//设置表头宽度
ui->tableWidget->horizontalHeader()->setFixedWidth(341);
//设置表头内容
QStringList Header;
Header << "设备列表";
ui->tableWidget->setHorizontalHeaderLabels(Header);
//内容不可编辑
ui->tableWidget->setEditTriggers(QAbstractItemView::NoEditTriggers);
//设置选中背景色
ui->tableWidget->setStyleSheet("selection-background-color:skyblue;");
//CTRL控制多选
ui->tableWidget->setSelectionMode(QAbstractItemView::ExtendedSelection);
//设置是否显示滚动条
ui->tableWidget->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOn);
//根据内容自动调整列宽
ui->tableWidget->resizeColumnsToContents();
ui->tableWidget->setItem(i, 0, new QTableWidgetItem(str));
//单列时滚动条随点滚动, ScrollPerItem 随项目滚动
ui->tableWidget->setHorizontalScrollMode(QAbstractItemView::ScrollPerPixel);
//设置水平、垂直滚动栏样式
ui->tableWidget->horizontalScrollBar()->setStyleSheet("QScrollBar{background:transparent; height:10px;}"
"QScrollBar::handle{background:lightgray; border:2px solid transparent; border-radius:5px;}"
"QScrollBar::handle:hover{background:gray;}"
"QScrollBar::sub-line{background:transparent;}"
"QScrollBar::add-line{background:transparent;}");
ui->tableWidget->verticalScrollBar()->setStyleSheet("QScrollBar{background:transparent; width: 10px;}"
"QScrollBar::handle{background:lightgray; border:2px solid transparent; border-radius:5px;}"
"QScrollBar::handle:hover{background:gray;}"
"QScrollBar::sub-line{background:transparent;}"
"QScrollBar::add-line{background:transparent;}");
4、LineEdit 控件
//只允许输入1-0xFFFF,大小写字母无限制,最长4
//A-F1-9 只能输入大写字母
QRegExp regExp("(0x[0-9a-fA-F]{1,4})|(0X[0-9a-fA-F]{1,4})");
ui->lineEdit_PID->setValidator(new QRegExpValidator(regExp, this));
//限制输入int的范围
QValidator *validator = new QIntValidator(0, 524288, this);
ui->fw_up_lineEdit->setValidator(validator);
//限制输入长度 16byte
ui->lineEdit_P_DESC->setMaxLength(8);
//显示提示信息
ui->lineEdit_PID->setToolTip("0x0001-0xFFFF");
5、日志
#include <QMessageLogContext>
//1、注册MessageHandler
qInstallMessageHandler(outputMessage);
//2、自定义日志格式,日志级别、日志打印时间、日志所在行、日志信息
void outputMessage(QtMsgType type, const QMessageLogContext &context, const QString &msg)
{
static QMutex mutex;
mutex.lock();
QString text;
switch (type)
{
case QtDebugMsg:
text = QString("Debug: ");
break;
case QtWarningMsg:
text = QString("Warning: ");
break;
case QtCriticalMsg:
text = QString("ERR: ");
break;
case QtFatalMsg:
text = QString("Fatal: ");
}
QString context_info = QString("File:(%1) Line:(%2)").arg(QString(context.file)).arg(context.line);
QString current_date_time = QDateTime::currentDateTime().toString(" yyyy-MM-dd hh:mm:ss ");
QString current_date = QString("(%1)").arg(current_date_time);
#ifndef RELEASE
QString message = QString("%1 %2 %3 %4").arg(current_date).arg(text).arg(context_info).arg(msg);
#else
QString message = QString("%1 %2 %3").arg(text).arg(current_date).arg(msg);
#endif
QFile file("log.txt");
file.open(QIODevice::WriteOnly | QIODevice::Append);
QTextStream text_stream(&file);
text_stream << message << "\r\n";
file.flush();
file.close()
mutex.unlock();
}
6、杂项
//设置窗口标题
this->setWindowTitle(QString("参数输入"));
//设置控件是否可点击
ui->toolButton->setDisabled(true);
ui->comboBox->setEnabled(true);
//WCHAR * 赋值
WCHAR *devName = (WCHAR *)L"\\\\?\\usbstor";
一、警告\错误处理
1、汉字显示乱码\警告C4819:该文件包含不能在当前代码页(936)中标识的字符
工具-选项-行为-文件编码,默认编码选择utf-8,utf-8 BOM 选择 “如果编码是utf-8则添加”,文件头添加语句 #pragma execution_character_set("utf-8")
2、对象被多次指定
pro文件中多次添加同意文件,pro中删除多次添加的文件,执行qmake后重新构建
二、数据类型转换
1、带汉字的Qstring 转 char*
//解决汉字乱码问题
QTextCodec::setCodecForLocale(QTextCodec::codecForName("GBK"));
//转换步骤
char *fwchar = NULL;
QByteArray ba_fw = QString fw_version.toLocal8Bit(); \\ QString转QByteArray
| fwchar = (char *)malloc(ba_fw.length() + 1); \\ char* 分配空间 |
| memcpy(fwchar, ba_fw.data(), ba_fw.length());\\ QByteArray复制到char* |
| fwchar[ba_fw.length()] = '\0'; |
2、QString 转 int,随意进制
Int = QString.toInt(nullptr, 16); \\ 数字代表进制,16, 10 ,8 等
3、QString 转 LPCWSTR
Std::wstring = Qstring.toStdWString();
LPCWSTR = Std::wstring.c_str();
4、//TCHAR 2 QString
str = QString::fromWCharArray(acDevPath[i]);
5、// QString to LPCWSTR
wstr_fileName = fileName.toStdWString();
6、//QString to long
offset_onLine = offset_in.toLong();
三、ListWidget 控件应用
1、信号/槽
单击选择\双击选择
2、选择模式控制
ui->listWidget->setSelectionMode(QAbstractItemView::ExtendedSelection);// CTRL或SHIFT时可实现多选
public:
enum SelectionMode {
NoSelection, |
|
| 不能选中 |
SingleSelection, |
|
| 只能单选 |
MultiSelection, |
|
| 只能多选 |
ExtendedSelection, |
|
| CTRL或SHIFT时可实现多选 |
ContiguousSelection |
|
| 选一片,连续选择 |
};
Q_ENUM(SelectionMode)
//ListWidget 多选模式获取行号和所选行内容
void MainWindow::choice_Device()
{
QList<QListWidgetItem*>items=ui->listWidget->selectedItems();
count=items.count();
ui->textBrowser->append("count = " + QString::number(count));
if(count == 0) {
QMessageBox mesg;
mesg.warning(this, "warning!", "未选择设备!");
return;
}
for(int i=0;i< count;i++)
{
currenRow[i] = ui->listWidget->row(items.at(i));//获取选中的行
ui->textBrowser->append(tr("currenRow[%1] = %2").arg(i) .arg(currenRow[i]));
QListWidgetItem*item=items.at(i);
QString name=item->text();//获取内容
ui->textBrowser->append(name);
}
}
3、TableWidget控件
//设置列数
ui->tableWidget->setColumnCount(1);
//设置行数
ui->tableWidget->setRowCount(16);
//设置默认部分大小
ui->tableWidget->horizontalHeader()->setDefaultSectionSize(150);
//设置行填充
ui->tableWidget->horizontalHeader()->setStretchLastSection(true);
//设置表头不可被选中
ui->tableWidget->horizontalHeader()->setSectionsClickable(false);
//消除表格控件的边框
ui->tableWidget->setFrameShape(QFrame::NoFrame);
//不显示网格
ui->tableWidget->setShowGrid(true);
//设置表头宽度
ui->tableWidget->horizontalHeader()->setFixedWidth(341);
//设置表头内容
QStringList Header;
Header << "设备列表";
ui->tableWidget->setHorizontalHeaderLabels(Header);
//内容不可编辑
ui->tableWidget->setEditTriggers(QAbstractItemView::NoEditTriggers);
//设置选中背景色
ui->tableWidget->setStyleSheet("selection-background-color:skyblue;");
//CTRL控制多选
ui->tableWidget->setSelectionMode(QAbstractItemView::ExtendedSelection);
//设置是否显示滚动条
ui->tableWidget->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOn);
//根据内容自动调整列宽
ui->tableWidget->resizeColumnsToContents();
ui->tableWidget->setItem(i, 0, new QTableWidgetItem(str));
//单列时滚动条随点滚动, ScrollPerItem 随项目滚动
ui->tableWidget->setHorizontalScrollMode(QAbstractItemView::ScrollPerPixel);
//设置水平、垂直滚动栏样式
ui->tableWidget->horizontalScrollBar()->setStyleSheet("QScrollBar{background:transparent; height:10px;}"
"QScrollBar::handle{background:lightgray; border:2px solid transparent; border-radius:5px;}"
"QScrollBar::handle:hover{background:gray;}"
"QScrollBar::sub-line{background:transparent;}"
"QScrollBar::add-line{background:transparent;}");
ui->tableWidget->verticalScrollBar()->setStyleSheet("QScrollBar{background:transparent; width: 10px;}"
"QScrollBar::handle{background:lightgray; border:2px solid transparent; border-radius:5px;}"
"QScrollBar::handle:hover{background:gray;}"
"QScrollBar::sub-line{background:transparent;}"
"QScrollBar::add-line{background:transparent;}");
4、LineEdit 控件
//只允许输入1-0xFFFF,大小写字母无限制,最长4
//A-F1-9 只能输入大写字母
QRegExp regExp("(0x[0-9a-fA-F]{1,4})|(0X[0-9a-fA-F]{1,4})");
ui->lineEdit_PID->setValidator(new QRegExpValidator(regExp, this));
//限制输入int的范围
QValidator *validator = new QIntValidator(0, 524288, this);
ui->fw_up_lineEdit->setValidator(validator);
//限制输入长度 16byte
ui->lineEdit_P_DESC->setMaxLength(8);
//显示提示信息
ui->lineEdit_PID->setToolTip("0x0001-0xFFFF");
5、日志
#include <QMessageLogContext>
//1、注册MessageHandler
qInstallMessageHandler(outputMessage);
//2、自定义日志格式,日志级别、日志打印时间、日志所在行、日志信息
void outputMessage(QtMsgType type, const QMessageLogContext &context, const QString &msg)
{
static QMutex mutex;
mutex.lock();
QString text;
switch (type)
{
case QtDebugMsg:
text = QString("Debug: ");
break;
case QtWarningMsg:
text = QString("Warning: ");
break;
case QtCriticalMsg:
text = QString("ERR: ");
break;
case QtFatalMsg:
text = QString("Fatal: ");
}
QString context_info = QString("File:(%1) Line:(%2)").arg(QString(context.file)).arg(context.line);
QString current_date_time = QDateTime::currentDateTime().toString(" yyyy-MM-dd hh:mm:ss ");
QString current_date = QString("(%1)").arg(current_date_time);
#ifndef RELEASE
QString message = QString("%1 %2 %3 %4").arg(current_date).arg(text).arg(context_info).arg(msg);
#else
QString message = QString("%1 %2 %3").arg(text).arg(current_date).arg(msg);
#endif
QFile file("log.txt");
file.open(QIODevice::WriteOnly | QIODevice::Append);
QTextStream text_stream(&file);
text_stream << message << "\r\n";
file.flush();
file.close()
mutex.unlock();
}
6、杂项
//设置窗口标题
this->setWindowTitle(QString("参数输入"));
//设置控件是否可点击
ui->toolButton->setDisabled(true);
ui->comboBox->setEnabled(true);
//WCHAR * 赋值
WCHAR *devName = (WCHAR *)L"\\\\?\\usbstor";