槽函式內多次new和connect問題解決

2021-10-14 03:49:32 字數 1613 閱讀 8523

qwidget chinese_key =

new qwidget;

chinese_key-

>

setattribute

(qt::wa_deleteonclose)

;//設定自動釋放記憶體

chinese_key-

>

show()

;

void displaymain::

chinese_keyboad_slot()

問題所在: 在槽函式內出現new建立多次qwidget記憶體區域,賦值給同乙個變數。

問題解決:

加入if判斷語句

void displaymain::

chinese_keyboad_slot()

定義為全域性變數或者靜態變數,也就不把new建立的變數語句放在槽函式內。

void displaymain::

chinese_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::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函式

GlobalAlloc函式和new 的區別

1.globalalloc函式和new 的區別。1 new是標準的c 分配記憶體函式。globalalloc是win下的api函式。2 new分配記憶體同時會呼叫類等物件的建構函式。globalalloc不回。3 new分配的記憶體只能同程序使用,如 a程序new,b程序不能delete globa...

new建構函式和原型鏈

new建構函式functionpeople name,age 這個函式是不是建構函式?他沒有被呼叫,用new呼叫後就是建構函式,不被new呼叫就不是建構函式 functionpeople name,age varobj people 小明 12 alert obj null alert obj.ag...

過載new和delete來防止c 工程中記憶體洩漏

在c c 中指標給編碼帶來的極大的方便,但是同時由於分配的指標需要程式設計人員自行釋放記憶體,因此容易造成記憶體洩漏,c 中自帶的new delete本身沒有提供記憶體洩漏檢測的功能,不過我們可以過載這兩個函式來追蹤記憶體的分配和釋放,以此來檢測程式是否出現了記憶體洩漏。演算法的思想是在new一塊記...