最近在用QT写PE结构的分析工具,遇到了很多新的知识,在此记录,方便查阅若有新的收获,也会更新在此。
QT
QButton
QButton设置图片背景悬停样式
ui->logButton->setStyleSheet("QPushButton{border-image: url(:/icon/Image/表单定制01.png);}"//正常
"QPushButton:hover{border-image: url(:/icon/Image/表单定制02.png);}"//悬停
"QPushButton:pressed{border-image: url(:/icon/Image/表单定制03.png);}");//点击
QToolButton点击出现下拉菜单
ui->ToolsBox->setPopupMode(QToolButton::InstantPopup);//一定要加上
ui->ToolsBox->setToolButtonStyle(Qt::ToolButtonTextBesideIcon);
QMenu *toolMenu=new QMenu(ui->ToolsBox);
toolMenu->addAction(new QAction(QIcon(":/icon/Image/计算器.png"),"地址转换器(Ctrl+C)",toolMenu));
toolMenu->addAction(new QAction(QIcon(":/icon/Image/关于我们@2x.png"),"关于本软件(Ctrl+A)",toolMenu));
加上如下Qss可以去掉因为添加下拉菜单而导致的小三角
"QToolButton::menu-indicator{image:None;}"); //取消掉工具栏的小三角
QTableWiget
QTableWiget的基本用法
QStringList headList;
headList<<"Test"<<"Value";
m_iRow = 5;//表格当前行数
m_iCol = headList.size();//表格当前列数
ui->tableWidget->setColumnCount(m_iCol);//设置列数
ui->tableWidget->setRowCount(m_iRow);//设置行数
ui->tableWidget->horizontalHeader()->setSectionResizeMode(QHeaderView::Stretch);//自适应列宽
ui->tableWidget->setEditTriggers(QAbstractItemView::NoEditTriggers);//表格不能被编辑
ui->tableWidget->setSelectionBehavior(QAbstractItemView::SelectRows);//整行选中效果
ui->tableWidget->setSelectionMode(QAbstractItemView::SingleSelection);//设置为只能单选
ui->tableWidget->verticalHeader()->setVisible(false); //隐藏列表头
ui->tableWidget->horizontalHeader()->setVisible(false); //隐藏行表头
ui->tableWidget->setHorizontalHeaderLabels(headList);//设置表头
ui->tableWidget->setSelectionMode(QAbstractItemView::ExtendedSelection); //可多选(Ctrl、Shift、 Ctrl+A 等)
int iCurCount = ui->tableWidget->currentRow();//获取当前行数
//在单元格里面添加控件
QComboBox *comBox = new QComboBox(ui->tableWidget);
comBox->addItem("Y");
comBox->addItem("N");
ui->tableWidget->setCellWidget(4,0,comBox);
QLineEdit * l = new QLineEdit(ui->tableWidget);
l->setText("test");
ui->tableWidget->setCellWidget(4,1,l);
//设置表格某一列不能被编辑
QTableWidgetItem *item = ui->tableWidget->item(4,1);
item->setFlags(item->flags() & (~Qt::ItemIsEditable));
QString strText = ui->tableWidget->item(0, 0)->text(); //获取单元格内容
QList<QTableWidgetItem*> list = ui->tableWidget->selectedItems();//获取选择的Items
QTableWidget实现右键出现菜单
启用右键菜单
ui->tableWidget->setContextMenuPolicy(Qt::CustomContextMenu);//启用右键菜单
绑定右键点击信号 实现右键点击出现菜单
connect(§ionTab,&QTableWidget::customContextMenuRequested,[&](){
QMenu * menu = new QMenu;
QAction *action = new QAction;//构建菜单和菜单项
action->setText("菜单选项内容");
connect(menu,&QMenu::triggered,this,[&](){
func();
});
menu->addAction(action);
menu->exec(QCursor::pos());//菜单会出现在你鼠标点击的位置
delete menu;
delete action;//释放空间
;});
QTableWidget实现将内容复制到粘贴板
全部复制 传入表格指针即可复制到粘贴板
void BasicPE::CopyAll(QTableWidget *table)
{
int rows=table->rowCount();
int column=table->columnCount();
//储存复制字符串
QString str="";
//遍历表头 如若不需要复制表头去掉此行即可
for (int i=0;i<column;i++) {
str+=table->horizontalHeaderItem(i)->text();
}
//表头换行
str+="\n";
//遍历单元格
for(int i=0;i<rows;i++){
for (int j=0;j<column;j++) {
if(table->item(i,j)!=NULL){
str+=table->item(i,j)->text();
str+="\t";
}else{
str+="\t\t";
}
}
str+="\n";
}
QClipboard *bord;//剪切板功能
bord->setText(str);
}
选着复制 复制选中区域 传入表格指针即可使用
void BasicPE::CopySelect(QTableWidget *table)
{
QList<QTableWidgetItem*> tableWidgetItem = table->selectedItems();
if(tableWidgetItem.count()==0) //如果没有选择,返回
return;
//选择范围
int topRow ,buttomRow, leftColumn, rightColumn;
QList<QTableWidgetSelectionRange> tableSelectRange= table->selectedRanges();
for(int i=0;i<tableSelectRange.count();i++)
{
topRow= tableSelectRange.at(i).topRow();
buttomRow=tableSelectRange.at(i).bottomRow();
leftColumn=tableSelectRange.at(i).leftColumn();
rightColumn=tableSelectRange.at(i).rightColumn();
}
//复制到cliptext
QString clipText;
for (int i=topRow;i<=buttomRow;i++) {
for (int j=leftColumn;j<=rightColumn;j++) {
QString text;
if( table->item(i,j)!=nullptr )//这个很重要
text = table->item(i,j)->text();
clipText.append(text);
clipText.append("\t");
}
clipText.chop(1);//删除末尾一个字符
clipText.append("\n");
}
QClipboard *clipboard;//复制到剪贴板,可以粘贴到excel
clipboard->setText(clipText);
}
QFileInfo
获取各类文件的属性信息
QFileInfo是用来获取文件信息的,我们一起来看一下能获取什么,怎么获取这些信息吧!
举个例子比如可以获取快捷方式所指向的文件路径,基本上能想到的文件信息都可以获取
博客链接
Qt的QFileInfo
QDirIterator
QDirIterator遍历目录获取当前目录下的路径
//参数1 要遍历的目录 参数2 过滤器 参数3 过滤的类型
QDirIterator iter("logs",QStringList("*.log"),QDir::Files|QDir::NoSymLinks,QDirIterator::Subdirectories);
while(iter.hasNext())
{
iter.next();//迭代
QStringList logArray=iter.filePath();//返回路径列表
}
QJson
写入JSON文件
QT提供了如下类来操作JSON数据
#include <QJsonDocument>//json文本操作
#include <QJsonObject>//json对象
#include <QJsonParseError>//json错误信息
#include <QJsonArray>//json数组
QJsonObject setJsonObj;
QJsonObject setHelpJson;//使用QjsonObject对象插入键值对
QJsonObject setStyleJson;
QJsonArray setJsonArray;//json数组
QFile setFile("set/set.json");
setFile.open(QIODevice::Text|QIODevice::ReadWrite|QIODevice::Truncate);//QIODevice::Truncate 以重写的方式打开
setHelpJson["Log"]=LogKey;//这几个静态变量都是提前定义好的bool型或字符型数据
setHelpJson["Up"]=UpKey;
setHelpJson["Windowz"]=WindowzKey;
setStyleJson["FontColor"]=fontColor;
setStyleJson["BgColor"]=bgColor;
setStyleJson["GlobalStatus"]=globalStatus;
setJsonArray.append(setHelpJson);
setJsonArray.append(setStyleJson);
setJsonObj["PEGAME"]=setJsonArray;
QJsonDocument setJsonDoc(setJsonObj);//使用QjsonDocument设置该对象为json文档
setFile.seek(0);/*从头开始写*/
setFile.write(setJsonDoc.toJson()); //将Json以文本形式写入文件
setFile.flush();//刷新缓冲区
return true;
实现了在set.json中保存如下json格式数据
{
"PEGAME": [
{
"Log": true,
"Up": true,
"Windowz": false
},
{
"BgColor": "",
"FontColor": "",
"GlobalStatus": false
}
]
}
读取Json文件
QJsonParseError jsonError;//用来存放json错误
QJsonDocument getJsonDoc(QJsonDocument::fromJson(getText,&jsonError));
QJsonArray getJsonArray= getJsonDoc.object().value("PEGAME").toArray();//转化为Json数组
QJsonObject getJsonObj;
if(jsonError.error!=QJsonParseError::NoError)return false;
for (int i=0;i<getJsonArray.size();i++)
{
getJsonObj=getJsonArray.at(i).toObject();//转化为子对象
if(getJsonObj.contains("Log") && getJsonObj["Log"].isBool())
{ LogKey=getJsonObj["Log"].toBool(); }
if(getJsonObj.contains("Up") && getJsonObj["Up"].isBool())
{ UpKey=getJsonObj["Up"].toBool(); }
if(getJsonObj.contains("Windowz") && getJsonObj["Windowz"].isBool())
{ WindowzKey=getJsonObj["Windowz"].toBool(); }
if(getJsonObj.contains("FontColor") && getJsonObj["FontColor"].isString())
{ fontColor=getJsonObj["Log"].toString(); }
if(getJsonObj.contains("BgColor") && getJsonObj["BgColor"].isString())
{ bgColor=getJsonObj["BgColor"].toString(); }
if(getJsonObj.contains("GlobalStatus") && getJsonObj["GlobalStatus"].isBool())
{ globalStyle=getJsonObj["GlobalStyle"].toBool(); }
}
return true;
QT事件
鼠标拖拽
拖拽获取文件路径
//用户拖拽获取文件路径
protected:
void dragEnterEvent(QDragEnterEvent* e); //鼠标进入 用于筛选拖拽事件
void dropEvent(QDropEvent* e); //鼠标放下 用于处理拖拽事件
this->setAcceptDrops(true); //必须使部件接受放置事件
void MainWindow::dragEnterEvent(QDragEnterEvent* e)
{
//对拖放事件进行筛选 QMimeData类提为数据提供一个容器,用来记录关于MIME类型数据的信息
if (true)
{
e->acceptProposedAction(); //必须使部件接受放置事件
}
}
void MainWindow::dropEvent(QDropEvent* e)
{
//获取文件路径 (QString)
QList<QUrl> urls = e->mimeData()->urls();
if (urls.isEmpty())
{
return;
}
fileName = urls.first().toLocalFile();
}
键盘按下
实现组合快捷键
protected:
void keyPressEvent(QKeyEvent *event); //键盘按下事件
void MainWindow::keyPressEvent(QKeyEvent *event)
{
//组合键
if((event->modifiers()==Qt::ControlModifier) && (event->key()==Qt::Key_Q ) )
{
//要实现的功能
}
}
实现鼠标悬浮控件出现提示小框
myWidget -> setStatusTip ("StatusTip");//状态栏提示
myWidget -> setToolTip ("ToolTip"); //鼠标放到控件上,浮动出一个小黄框。
myWidget -> setWhatsThis ("WhatsThis");//QDialog 标题栏上有一个?按钮,先点按钮鼠标变问号,再点控件。