作者totemist (totem)
看板C_and_CPP
標題[問題] RadioButton 觸發事件
時間Thu Sep 10 14:33:00 2015
開發平台(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