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列的数据
}
}
结果: