信号与槽:
基本实现
Qt框架的核心设定就是信号与槽机制嘛,工作思路一般是:
1、信号函数:会在其设定的时间点发出,只需声明,无需函数体;使用emit关键字发出。
2、槽函数:在与其关联的信号函数发出时(类似于广播),该槽函数就会被触发调用。
3、槽函数的传参:槽函数的参数由信号函数负责传递;所以要求信号和槽函数的参数一毛一样,或者至少槽函数的所有参数同信号函数的前几个参数一毛一样,以便传参。(也就是说槽函数的参数个数小于等于信号函数的)
4、connect函数:用于将信号函数与槽函数相关联起来。
connect(sender, signal, receiver, slot);
参数(皆为指针型):
sender:发出信号的对象,例:ui->pushBotton
signal:发送对象发出的信号,例:&QAction::triggered
receiver:接收信号的对象,例:this
slot:接收对象在接收到信号之后所需要调用的函数,例:&MainWindow::aboutOut
窗口关闭时的响应
窗口关闭时会触发closeEvent事件函数,注意:这是个事件函数,既不是槽也不是信号。而且它在一个单独的类里,需要include一下。
//窗口类的头文件里加上:
#include <QCloseEvent>
//窗口类里加上其重定义的声明:
protected:
void closeEvent(QCloseEvent* event);
它会在相应窗口被关闭的时候被调用。例如,我想在TestWindow窗口关闭时调用它,来实现一些功能。
//在相应窗口的cpp文件中:
void TestWindow::closeEvent(QCloseEvent *event)
{
//TODO: 在退出窗口时,实现希望做的操作
}
多窗口:
创建多个窗口
第一步、自定义窗口的话就在Forms文件夹下添加一个Qt设计师界面类,然后开始敲新窗口;合并项目的话(一般是抄已有示例时233)就先把其它项目里的相应.h .cpp .prc .ui等文件复制进主项目,然后别忘改一下主项目的.pro文件。
第二步、在主窗口的头文件里
添加上子窗口的头文件
#include "子窗口头文件.h"
然后在主窗口类中添加私有成员,拥与指向新的子窗口
private:
ChildWindow *ChiWinPoint;
第三步、在需要建立新的子窗口的位置创建新的子窗口类对象,并将其显示
void MainWindow::SomeSolid() //主窗口的某槽函数
{
ChiWinPoint=new ChildWindow();
ChiWinPoint->show();
}
不同窗口间信号传递—emit
假设几个窗口类:win1,win2;想从1向2传信号,并触发相应槽函数。
//在win1.h中
class win1_class:public QWidget
{
// 信号声明区
signals:
// 声明信号 mySignal()
void win1Signal(参数);
slots:
// 声明用于发送信号的槽函数 slotForSendSignal()
void slotForSendSignal(参数);
};
void win1_class::slotForSendSignal(参数)//将它和win1里的某信号函数关联就行了
{
emit win1Signal(参数); //核心,发送信号,可带参数
}
假设win1P是一个指向win1窗口的指针:
//win2.h中
class win2_class:public QWidget
{
slots:
void Slot(参数);
};
将win1P发出的信号win1Signal()与所需触发的槽函数相关联。
// 信号与槽关联
connect(win1P, SIGNAL(win1Signal(参数)), this, SLOT(Slot(参数)));
void win2_class::Slot(参数)
{
// 函数实现
}
不希望出现多个同样的子窗口
方法很多嘛
比如说每次需要构造子窗口的时候先判断一下ChiWinPoint是否已经指向了一个子窗口,若指向为空则创建一个新窗口并显示,若已指向则不创建;而在子窗口关闭时将ChiWinPoint指针置空。
置空指针的方法:重定义closeEvent 事件函数,在子窗口关闭时向主窗口发送其关闭的信号。随后在主窗口中将该信号与一清空ChiWinPoint指针的函数connect起来。
再比如说,将 ChildWindow 改装成单例类。
设定主窗口关闭时所有窗口关闭
通用操作:
一、原理:
Qt::WA_QuitOnClose属性:表示当拥有该属性的最后一个部件接受到QCloseEvent事件(比如关闭该窗口)时,让Qt终止整个程序。
默认情况下,所有Qt::Window类型的部件都具有该属性。
那么,我们只需要将主窗口设定拥有该属性,而其它窗口设定为没有该属性;就可以实现在关闭主窗口时退出整个程序,进而关闭所有窗口。
二、实现:
主窗口设置属性Qt::WA_QuitOnClose
MainWindow.setAttribute(Qt::WA_QuitOnClose,true);
其它窗口
XX.setAttribute(Qt::WA_QuitOnClose,false);
这样关闭主窗口的时候,主程序就会退出,其它窗口也会关闭。
另外,为了方便,可以在其它窗口类的构造函数里加上一句
this->setAttribute(Qt::WA_QuitOnClose,false);
就不用在调用窗口的适合多写代码了……
其它:
中文乱码
原因:在一般c程序中,char型数组是用ASCII码来存放字符的;而中文显示需要使用宽字符。
解决:
使用QString::fromLocal8Bit函数,参数传入一个字符串常量,可以返回一个正常显示中文的QString
例:一个const char *s转QString :
QString qstr = QString (QString::fromLocal8Bit(cs)); //处理中文乱码
同格式QString转回上述格式char* :
char *cs = qstr.toLocal8Bit().data();
QtXlxs的使用
终于找到一个比较好用的操作Excel的工具了……
源码地址:QtXlxsWriter
使用方法:安装好库之后
.pro文件加上:
QT+= xlsx
头文件加上:
#include <QtXlsx>
#include <xlsxdocument.h>
代码:
QXlsx::Document xlsx(filePath);
//打开需要打开的excel文件,filePath为打开的文件名
QXlsx::CellRange range = xlsx.dimension();
int rowCounts = range.lastRow ();
//获取打开文件的最后一行(注意,如果最后一行有空格也为有效行)
int colCounts = range.lastColumn ();
//获取打开文件的最后一列
xlsx.read (i,j)//读取文件相应的行列(注意xlsx读取的文件的起始行列从1开始)
xlsx.write(i + 2, j + 1, text);//向相应的xlsx文件中写数据
xlsx.saveAs(filePath);//写完之后一定要保存