【QT】 QButton设置图片背景悬停样式 点击出现下拉菜单 QTable实现复制粘贴 QJson的读写 QDirIterator遍历目录 实现鼠标悬浮控件出现提示小框 组合快捷键

最近在用QT写PE结构的分析工具,遇到了很多新的知识,在此记录,方便查阅若有新的收获,也会更新在此。

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(&sectionTab,&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 标题栏上有一个?按钮,先点按钮鼠标变问号,再点控件。
  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

刘乙兵

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值