C++ QT5学习笔记 2020-9-21(托盘球最小化,在qt中使用excel,点击按钮跳转一个新窗口,将table widget中的内容传递到excel中并导出)

44 篇文章 8 订阅

1、托盘球最小化功能

首先布置一个最小化按钮:
在这里插入图片描述
在mainwindow.h中声明用到的指针以及功能函数:

//头文件
#include <QSystemTrayIcon>
//指针声明
public:
    QSystemTrayIcon *mSysTrayIcon;
    QMenu *mMenu;
    QAction *mShowMainAction;
    QAction *mExitAppAction;
//功能函数声明
public slots:
    void setMin();     //最小化按钮
    void on_activatedSysTrayIcon(QSystemTrayIcon::ActivationReason reason);    
    void createActions();       
    void createMenu();          
    void on_showMainAction();     
    void on_exitAppAction();    

在mainwindow.cpp中绑定信号槽和写函数功能:

//头文件
#include <QSystemTrayIcon>       //加到 .h 头文件里就可以了
#include <QAction>
#include <QMenu>

//按钮的背景和信号槽
QIcon button_ico(":/new/prefix1/source/3.jpg");
ui->pushButton->setIcon(button_ico);
connect(ui->pushButton_6, SIGNAL(clicked()), this, SLOT(setMin()));

添加以下函数

//托盘球最小化
void MainWindow::setMin()
{
    //this->setWindowState(Qt::WindowMinimized);
    //隐藏程序主窗口
    this->hide();

    //新建QSystemTrayIcon对象
    mSysTrayIcon = new QSystemTrayIcon(this);
    //托盘球背景
    QIcon icon = QIcon(":/new/prefix1/source/4.jpg");
    mSysTrayIcon->setIcon(icon);
    //当鼠标移动到托盘上的图标时,会显示此处设置的内容
    mSysTrayIcon->setToolTip(QObject::trUtf8(u8"双击显示主界面"));
    //添加槽函数连接
    connect(mSysTrayIcon,SIGNAL(activated(QSystemTrayIcon::ActivationReason)),this,SLOT(on_activatedSysTrayIcon(QSystemTrayIcon::ActivationReason)));
    //建立托盘操作的菜单
    createActions();
    createMenu();
    //在系统托盘显示此对象
    mSysTrayIcon->show();
}

//托盘菜单
void MainWindow::createActions()
{
    mShowMainAction = new QAction(QObject::trUtf8(u8"显示主界面"),this);  //不加u8乱码
    connect(mShowMainAction,SIGNAL(triggered()),this,SLOT(on_showMainAction()));

    mExitAppAction = new QAction(QObject::trUtf8(u8"退出"),this);
    connect(mExitAppAction,SIGNAL(triggered()),this,SLOT(on_exitAppAction()));

}

//菜单栏
void MainWindow::createMenu()
{
    mMenu = new QMenu(this);
    mMenu->addAction(mShowMainAction);

    mMenu->addSeparator();

    mMenu->addAction(mExitAppAction);

    mSysTrayIcon->setContextMenu(mMenu);
}

//显示主界面
void MainWindow::on_showMainAction()
{
    this->show();
    mSysTrayIcon->deleteLater();
}


//退出
void MainWindow::on_exitAppAction()
{
    exit(0);
}

//双击显示窗口
void MainWindow::on_activatedSysTrayIcon(QSystemTrayIcon::ActivationReason reason)
{
    switch(reason){
    case QSystemTrayIcon::Trigger:
        //单击托盘图标
        break;
    case QSystemTrayIcon::DoubleClick:
        //双击托盘图标
        //双击后显示主程序窗口
        this->show();
        mSysTrayIcon->deleteLater();    //删除图标
        break;
    default:
        break;
    }
}

功能参考自:https://blog.csdn.net/zhuyunfei/article/details/51433822
由于原文代码没有删除图标,导致多次最小化以后会生成多个图标,参照下方评论,这里我们要找到两次重启主界面的入口,分别是双击和右击主界面来显示窗口,在这两个功能下方增加删除图标的代码mSysTrayIcon->deleteLater();就可以了。

效果图:
在这里插入图片描述

2、Qt中使用excel

打开项目的.pro文件,在开头添加:
QT += axcontainer
excel操作:

    QString filepath="E:/filepath/"+QDateTime::currentDateTime().toString("yyyymmddhhmmss")+".xls";   //保存路径,用日期时间做文件名
    QAxObject *excel = new QAxObject(this);      //初始化一个excel对象
    excel->setControl("Excel.Application");      //连接Excel控件
    excel->dynamicCall("SetVisible (bool Visible)", true);      //显示excel窗口
    excel->setProperty("DisplayAlerts", false);       //不显示任何警告信息,比如关闭时提示是否保存。

    QAxObject *workbooks = excel->querySubObject("WorkBooks");    //获取工作簿集合
    workbooks->dynamicCall("Add");        //新建工作簿
    QAxObject *workbook = excel->querySubObject("ActiveWorkBook");     //当前工作簿
    QAxObject *worksheets = workbook->querySubObject("Sheets");    //工作表集合sheet
    QAxObject *worksheet = worksheets->querySubObject("Item(int)", 1);     //sheet1

    //写入数据,以属性列为例
    QAxObject *cella1 = worksheet->querySubObject("Cells(int,int)", 1,1);    //第1行第1列
    cella1->dynamicCall("Value",u8"日期");
    QAxObject *cellb1 = worksheet->querySubObject("Cells(int,int)", 1,2);
    cellb1->dynamicCall("Value", u8"时间");
    QAxObject *cellc1 = worksheet->querySubObject("Cells(int,int)", 1,3);
    cellc1->dynamicCall("Value", u8"地址");
    QAxObject *celld1 = worksheet->querySubObject("Cells(int,int)", 1,4);
    celld1->dynamicCall("Value", u8"坐标");
    QAxObject *celle1 = worksheet->querySubObject("Cells(int,int)", 1,5);
    celle1->dynamicCall("Value", u8"x轴");
    QAxObject *cellf1 = worksheet->querySubObject("Cells(int,int)", 1,6);
    cellf1->dynamicCall("Value", u8"y轴");
    QAxObject *cellg1 = worksheet->querySubObject("Cells(int,int)", 1,7);
    cellg1->dynamicCall("Value", u8"类别");
    QAxObject *cellh1 = worksheet->querySubObject("Cells(int,int)", 1,8);
    cellh1->dynamicCall("Value", u8"清晰");
    QAxObject *celli1 = worksheet->querySubObject("Cells(int,int)", 1,9);
    celli1->dynamicCall("Value", u8"长度");
    QAxObject *cellj1 = worksheet->querySubObject("Cells(int,int)", 1,10);
    cellj1->dynamicCall("Value", u8"面积");
    QAxObject *cellk1 = worksheet->querySubObject("Cells(int,int)", 1,11);
    cellk1->dynamicCall("Value", u8"梯度");
    
    workbook->dynamicCall("SaveAs(const QString&)", QDir::toNativeSeparators(filepath));  //保存到路径filepath
    workbook->dynamicCall("Close()");     //关闭工作簿
    excel->dynamicCall("Quit()");        //关闭excel,执行时excel一闪而过,就是这一句又把excel关闭了

看一下结果:
在这里插入图片描述

3、Qt简单的按钮跳转新窗口

首先右击工程,选择add NEW,选择Qt设计师界面类:
在这里插入图片描述
选择界面模板选择Dialog without Buttons,类名自行填写。
在这里插入图片描述
接着,工程中就会出现三个文件(由于刚刚类名中有大写,所以和头文件名不一样):
在这里插入图片描述
一个空的窗口就创建完了,打开主窗口的头文件 mainwindow.h,在其引用的头文件中添加:

#include "sqlin.h"  //根据自己定义的窗口的头文件名写

接着,布置一个按钮,在头文件中声明其功能并在.cpp中进行信号槽的连接。
在这里插入图片描述

按钮的功能如下方这样写:

//mainwindow.h中加入
#include "sqlin.h"

public slots:
    void btn();
    
//mainwindow.cpp中加入
connect(ui->pushButton, SIGNAL(clicked()), this, SLOT(btn()));

void MainWindow::btn()
{   //这与直接show()不同,操作权会直接转到这个sqlIN中,原窗口会变的不可操作        
    sqlIN d;      
    d.exec();     //这里的sqlIN根据类名来写,打开sqlin.cpp就能看到页面的类了
}

按钮跳出新窗口就完成了。
运行结果:
在这里插入图片描述
然后这个跳转的窗口就可以自行设计。

4、将 table widget 中的值传递到excel

结合上面的excel操作,读取table widget的内容,插入到excel中并保存。
下面的代码都写在导出到excel的功能函数中。

    //要注意excel单元格是从(1,1)开始,而table widget的单元格是从(0,0)开始的,而且其属性是不占单元格的
    int i,j;
    for(i=2;i-2<rownm;i++)
     {  for(j=1;j<=11;j++)
        {
            QAxObject *cell = worksheet->querySubObject("Cells(int,int)", i,j);  //存放的单元格i行j列
            cell->dynamicCall("Value", ui->tableWidget->item(i-2,j-1)->text());  //i-2行j-1列的数据
        }
    }

结果:
在这里插入图片描述

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值