看板 C_and_CPP 關於我們 聯絡資訊
開發平台(Platform): (Ex: VC++, GCC, Linux, ...) QT 額外使用到的函數庫(Library Used): (Ex: OpenGL, ...) 問題(Question): radiobutton切換以及執行事件問題請教 餵入的資料(Input): 預期的正確結果(Expected Output): 想在GUI介面上做出單選紐,並能依照選紐而執行不同事件。 錯誤結果(Wrong Output): 目前介面上能做出單選紐,但按下按鈕後的反應不知道哪裡有誤 程式碼(Code):(請善用置底文網頁, 記得排版) QGroupBox *buttonGrpBox = new QGroupBox("Function:"); buttonCheckBox = new QCheckBox("Choose Function"); buttonCheckBox->setChecked(false); buttonEnabled= false; connect(buttonCheckBox, SIGNAL(clicked()), this, SLOT(buttonCheckBoxClicked())); A = new QRadioButton(tr("Function A")); A -> setChecked(false); AEnabled = false; connect(A,SIGNAL(clicked()),this,SLOT(AClicked())); B = new QRadioButton(tr("Function B")); B -> setChecked(false); BEnabled = false; connect(B,SIGNAL(clicked()),this,SLOT(BClicked())); C = new QRadioButton(tr("Function C")); C -> setChecked(false); CEnabled = false; connect(C,SIGNAL(clicked()),this,SLOT(CClicked())); QVBoxLayout *FunctionLayout = new QVBoxLayout; FunctionLayout -> addWidget(buttonCheckBox); FunctionLayout -> addWidget(A); FunctionLayout -> addWidget(B); FunctionLayout -> addWidget(C); buttonGrpBox->setLayout(FuncitonLayout); 中略 ..... if(buttonEnabled) { if(AEnabled) { // DO A } else if(BEnabled) { // DO B } else if(CEnabled) { // DO C } else { // DO NOTHING } } 補充說明(Supplement): 只擷取部分code,該宣告的都有宣告, 原本以為會不會是radiobutton沒有設好,後來在三個Function做簡單的測試都是有反應的 目前用buttoncheckbox控制3個單選紐,按下buttonchexkbox後radiobutton才有作用, 在buttoncheckbox上的切換作用是成功的。 現在問題就是當我點選了buttonchackbox後,執行C->B->A都可以但是要再切換為B或C 就無法執行,即使把buttoncheckbox重新勾選依舊會卡在A 感覺是我迴圈寫法的問題: 目前寫法由下往上都可以,但要從上往下都不行。 先選C就可以C->B->A 或 C->A ,逆向不行。 先選B 就只能B->A,逆向不行。 先選A 就只卡在A。 懇請大大門解惑 謝謝 -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 140.114.28.223 ※ 文章網址: https://www.ptt.cc/bbs/C_and_CPP/M.1441866783.A.CD6.html ※ 編輯: totemist (140.114.28.223), 09/10/2015 14:37:08 ※ 編輯: totemist (140.114.28.223), 09/10/2015 14:46:04
yichen: 在if的判斷中,A最先檢查,然後只要A是enabled,後面都不會被 09/10 15:35
yichen: 執行了。 如果不要用else if, 每個按鈕都是if來判斷,應該 09/10 15:36
yichen: 就不會卡死在A 09/10 15:37
yichen: 不過使用QRadioButton的話, 用toggled()這個signal,然後 09/10 15:40
yichen: 判斷isChecked()比較合適 09/10 15:40
yichen: 更正第一行if的部份,應該不是不要使用else if,而是要確認 09/10 15:54
yichen: 你在按其他按鈕的時候,有把AEnabled給設false 09/10 15:54
yichen: 不然用isChecked()來判斷radio button是不是被按下就好 09/10 15:55
我自己是有把isChecked()寫好,應該跟Y大您的意思一樣吧? void AClicked() { AEnabled = A->isChecked(); } void BClicked() { BEnabled = B->isChecked(); } void CClicked() { CEnabled = C->isChecked(); } ※ 編輯: totemist (140.114.28.223), 09/10/2015 16:20:58
yichen: 你的程式問題出在A被點了就把AEnabled設成true,但是 09/10 16:50
已經成功了~ 感謝Y大 主要就是要改用SIGNAL(toggled(bool)) 這樣即可~ ※ 編輯: totemist (140.114.28.223), 09/10/2015 16:51:25
yichen: 在B或C被點的時候,AEnabled沒有被設成false,一直都是true 09/10 16:50
yichen: 或是在你的if(buttonEnable){底下,直接判斷if(A->isCheck 09/10 16:56
yichen: ed())就好,不會有AEnabled沒有被重設回false的情況 09/10 16:57
yichen: anyway, 恭禧你成功了! :) 09/10 16:58