槽函数内多次new和connect问题解决

本文探讨了在QT开发中如何避免槽函数内多次new和connect导致的问题,通过添加条件判断、使用全局或静态变量,以及理解并应用Qt的连接选项。重点讲解了为何这些问题可能出现以及如何有效解决,以提升代码的健壮性和性能。

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

在做QT开发时,在槽函数内,实现new动态申请内存,有的需要指定父对象,有的不需要,再未指定父对象的变量,必须加上关键词或者手动在delete。

  • QWidget及其派生类的对象,可以设置 Qt::WA_DeleteOnClose 标志位(当close时会析构该对象)
  • QAbstractAnimation派生类的对象,可以设置QAbstractAnimation::DeleteWhenStopped
  • QRunnable::setAutoDelete() MediaSource::setAutoDelete()
    如:
    QWidget chinese_key = new QWidget;
    chinese_key->setAttribute(Qt::WA_DeleteOnClose);	//设置自动释放内存
    chinese_key->show();

https://blog.youkuaiyun.com/u011555996/article/details/108027806

1. 槽函数内多次new问题

void DisplayMain::chinese_keyboad_slot()
{
	//头文件中定义:QWidget *chinese_key_window;
    chinese_key_window = new QWidget(this);            
    //window2->setAttribute(Qt::WA_DeleteOnClose);
    chinese_key_window->move(63, 148);
    chinese_key_window->setFixedSize(723, 429);
}

问题所在: 在槽函数内出现new创建多次QWidget内存区域,赋值给同一个变量。
问题解决:

  1. 加入if判断语句
void DisplayMain::chinese_keyboad_slot()
{
	//头文件中定义:QWidget *chinese_key_window;
    if (chinese_key_window == NULL)
        chinese_key_window = new QWidget(this);             //防止槽函数中,多次new变量
    //window2->setAttribute(Qt::WA_DeleteOnClose);
    chinese_key_window->move(63, 148);
    chinese_key_window->setFixedSize(723, 429);
}
  1. 定义为全局变量或者静态变量,也就不把new创建的变量语句放在槽函数内。

2. 槽函数内多次connect问题

void DisplayMain::chinese_keyboad_slot()
{
	//头文件中定义:QWidget *chinese_key_window;
    if (chinese_key_window == NULL)
        chinese_key_window = new QWidget(this);             //防止槽函数中,多次new变量
    //window2->setAttribute(Qt::WA_DeleteOnClose);
    chinese_key_window->move(63, 148);
    chinese_key_window->setFixedSize(723, 429);
     chinese_key_window->show();
     
   	//多次执行connect语句
	if (chinese_text == NULL)
	    chinese_text = new QTextEdit(this);
    chinese_text->setFixedSize(262, 211);
    chinese_text->move(460, 122);
    chinese_text->show();
    connect(chinese_text, &QTextEdit::selectionChanged, this, &DisplayMain::keyboad_slot);
}

问题所在: 在槽函数内出现多次connect安装信号槽的现象。
问题解决:
加入connect第五个参数:Qt::UniqueConnection

将语句:
connect(chinese_text, &QTextEdit::selectionChanged, this, &DisplayMain::keyboad_slot);
改为:
connect(chinese_text, &QTextEdit::selectionChanged, this, &DisplayMain::chinese_keyboad_slot, Qt::UniqueConnection);

具体详情如下:

QT中查看connect函数定义如下图所示:
在这里插入图片描述
在QT中的注释可以看出,connect拥有第五个参数,点击查看参数选项。
在这里插入图片描述

常量描述
Qt::AutoConnection0(默认)如果接收器位于发出信号的线程中,则使用Qt::DirectConnection。否则,使用Qt::QueuedConnection。连接类型是在信号发出时确定的。
Qt::DirectConnection1发出信号时立即调用插槽。槽在信令线程中执行。
Qt::QueuedConnection2当控制返回到接收方线程的事件循环时,将调用插槽。插槽在接收方的线程中执行。
Qt::BlockingQueuedConnection3与Qt::QueuedConnection相同,除了信令线程阻塞直到插槽返回。如果接收端位于信令线程中,则绝不能使用此连接,否则应用程序将死锁。
Qt::UniqueConnection0x80这是一个标记,可以使用位或与上述任何一种连接类型结合使用。当Qt::UniqueConnection被设置后,如果连接已经存在,QObject::connect()将会失败(即,如果相同的信号已经为同一对对象连接到相同的槽位)。这个标志是在Qt 4.6中引入的。

详细的解释:QT出现重复调用SLOT函数

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值