在做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
内存区域,赋值给同一个变量。
问题解决:
- 加入
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);
}
- 定义为
全局变量
或者静态变量
,也就不把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::AutoConnection | 0 | (默认)如果接收器位于发出信号的线程中,则使用Qt::DirectConnection。否则,使用Qt::QueuedConnection。连接类型是在信号发出时确定的。 |
Qt::DirectConnection | 1 | 发出信号时立即调用插槽。槽在信令线程中执行。 |
Qt::QueuedConnection | 2 | 当控制返回到接收方线程的事件循环时,将调用插槽。插槽在接收方的线程中执行。 |
Qt::BlockingQueuedConnection | 3 | 与Qt::QueuedConnection相同,除了信令线程阻塞直到插槽返回。如果接收端位于信令线程中,则绝不能使用此连接,否则应用程序将死锁。 |
Qt::UniqueConnection | 0x80 | 这是一个标记,可以使用位或与上述任何一种连接类型结合使用。当Qt::UniqueConnection被设置后,如果连接已经存在,QObject::connect()将会失败(即,如果相同的信号已经为同一对对象连接到相同的槽位)。这个标志是在Qt 4.6中引入的。 |
详细的解释:QT出现重复调用SLOT函数