Qt中的常用操作汇总(更新中)

本文汇总了Qt编程中的关键操作,包括信号与槽机制的使用,如窗口关闭响应和不同窗口间的信号传递。讲解了如何创建和管理多个窗口,防止重复创建,以及设定主窗口关闭时关闭所有窗口的策略。同时,还涉及中文乱码的解决方法和QtXlxs库在处理Excel文件上的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

信号与槽:

基本实现

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);//写完之后一定要保存
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值