[問題] QT addWidget後可以再remove嗎?

看板C_and_CPP (C/C++)作者 (台灣犬可愛)時間8年前 (2017/06/05 23:14), 8年前編輯推噓6(606)
留言12則, 8人參與, 最新討論串1/1
開發平台(Platform): (Ex: Win10, Linux, ...) linux 編譯器(Ex: GCC, clang, VC++...)+目標環境(跟開發平台不同的話需列出) QT creator 額外使用到的函數庫(Library Used): (Ex: OpenGL, ...) 問題(Question): Scene Class繼承QGraphicsScene。 用QGraphicsScene::addWidget將PushButton加入Scene中。 希望可以按了PushButton之後,PushButton會從Scene中移除。 寫了connect(QQ,SIGNAL(clicked()),this,SLOT(deleteQQ(QQ))); 錯誤訊息是:QObject::connect: No such slot QGraphicsScene::deleteQQ(QQ) 可是不是應該要是Scene::deleteQQ(QQ)嗎? 餵入的資料(Input): 按一下PushButton 預期的正確結果(Expected Output): PushButton消失 錯誤結果(Wrong Output): 沒有消失 程式碼(Code):(請善用置底文網頁, 記得排版) #ifndef SCENE_H #define SCENE_H #include <QGraphicsScene> #include <QGraphicsProxyWidget> #include <QPushButton> class Scene:public QGraphicsScene { public: Scene(); QPushButton* QQ; public slots: void deleteQQ(QPushButton* T); }; #endif // SCENE_H __________________________________________________________________ #include "scene.h" #include <QApplication> Scene::Scene() { QQ= new QPushButton(); QQ->setGeometry(50,50,100,30); QQ->setText(tr("自生自滅鍵")); QGraphicsProxyWidget *QQQ = this->addWidget(QQ); //按一下按鈕後按鈕從scene消失 connect(QQ,SIGNAL(clicked()),this,SLOT(deleteQQ(QQ))); } void Scene::deleteQQ(QPushButton* T){ delete T; } 補充說明(Supplement): 有其他可以把PushButton移除的方法也請麻煩教我... 試過connect(QQ,SIGNAL(clicked()),QQ,SLOT(~QPushButton())); 不懂為何不行。 -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 218.164.182.117 ※ 文章網址: https://www.ptt.cc/bbs/C_and_CPP/M.1496675684.A.716.html

06/06 08:19, , 1F
只把元件隱藏起來不好嗎
06/06 08:19, 1F
可以請教詳情嗎?

06/06 10:29, , 2F
想要用signal-slot機制, class宣告內要有Q_OBJECT macro
06/06 10:29, 2F
謝謝,我晚一點試看看 ※ 編輯: franklin1997 (140.116.49.123), 06/06/2017 15:10:57

06/06 20:17, , 3F
SLOT(~QPushButton()) <==你認真的嗎...
06/06 20:17, 3F

06/07 03:11, , 4F
抱歉新學很多東西不會...
06/07 03:11, 4F
剛剛發現訊號槽沒有辦法這樣傳引數,所以應該是刪不掉了,謝謝 ※ 編輯: franklin1997 (218.164.181.198), 06/07/2017 03:13:07 ※ 編輯: franklin1997 (218.164.181.198), 06/07/2017 03:21:54

06/07 13:57, , 5F
自己開一個SLOT DELETE自己
06/07 13:57, 5F

06/07 21:24, , 6F
印象中Qt的東西都要先removeItem, 不然後面delete會
06/07 21:24, 6F

06/07 21:24, , 7F
有問題
06/07 21:24, 7F

06/07 23:49, , 8F
你這個等於用function call delete自己,很危險
06/07 23:49, 8F

06/07 23:52, , 9F
呼叫hide()就可以隱藏widget
06/07 23:52, 9F

06/07 23:56, , 10F
connect(QQ,SIGNAL(clicked()),QQ,SLOT(hide())
06/07 23:56, 10F

06/08 12:12, , 11F
真要 delete 也是可以啦, QObject 有 deleteLater()
06/08 12:12, 11F

06/08 12:13, , 12F
機制是在 event loop 下次有空閒時幫你呼叫 desctructor
06/08 12:13, 12F
文章代碼(AID): #1PDNLaSM (C_and_CPP)
文章代碼(AID): #1PDNLaSM (C_and_CPP)