2011-06-15 124 views
1

我想在我的用戶界面中插入一個複選框,它可以根據其選中狀態從另一個類設置布爾變量true或false。問題在於信號沒有被髮射。爲什麼QCheckBox的信號沒有發射?

變量將在我的第一類(renderarea.h)的報頭文件作爲

public: 
bool selectionMode;

限定該狹槽在第二類的頭文件爲void

 
protected slots: 
void setSelectionMode(bool mode); 

而信號定義連接到我的第二類源文件在構造函數中的插槽爲:

 
PaintWidget::PaintWidget(QWidget *parent) : 
     QWidget(parent), 
     ui(new Ui::PaintWidget) 
{ 
connect(ui->selectionModeCheckBox, SIGNAL(toggled(bool)), this, SLOT(setSelectionMode(bool))); 
} 
void PaintWidget::setSelectionMode(bool mode) 
{ 
    ui->displayWidget->selectionMode = mode; 

    QMessageBox msgbox; 
    if (ui->displayWidget->selectionMode == true) 
     msgbox.setText("selection mode is true"); 
    else 
     msgbox.setText("selection mode is false"); 
} 

我在這裏使用QMessageBox僅用於測試原因。但是在調試時我發現信號沒有被髮射。我究竟做錯了什麼?

+0

一個簡單的問題,你可以使你的連接無效,並檢查在調試輸出你得到正確的錯誤信息(類似qt :: connect不可能連接) – Fezvez 2011-06-15 16:13:57

+0

我沒有得到任何錯誤消息。這就是爲什麼我在這裏問。我不明白爲什麼信號不發光。 – schmimona 2011-06-15 18:01:39

+0

在你的ParentWidget類中,你有Q_OBJECT宏嗎?這可能會導致連接問題的一些古怪。 – 2011-06-15 20:28:52

回答

0

只是爲了澄清,當你說插槽是在頭文件中,你的意思是在插槽之後:label,對吧?

+0

是的。它被定義爲受保護的槽:void setSelectionMode(bool mode); – schmimona 2011-06-15 15:52:36

+0

嗯。在ui設計器中是否有可能錯誤地將錯誤的元素命名爲setSelectionModeCheckBox?如果不瞭解應用程序,就很難猜測。 – jpm 2011-06-15 16:12:38

+0

它是我繪製的應用程序。我想要這個複選框,這樣我可以在繪圖模式之間切換(如果勾選了x,如果不繪製y)。這是基本的想法。我在應用程序中只有一個複選框,所以我懷疑這個名字有一些錯誤。我試過調試器,但是我的應用程序訪問connect語句的唯一時間是啓動時。在此之後,無論我檢查和取消選中多少次,它都不會進入連接模式。我也試過所有其他信號(clicked,statechanged),但似乎沒有任何工作。我真的不知道爲什麼。 – schmimona 2011-06-15 16:41:46

0

您應該使用stateChanged()信號,該信號在複選框狀態發生變化時發出。它給了你一個整數,因爲複選框也可以是三態的(但你可以在你的情況下使用該int值作爲布爾值)。

+0

我試過那個信號。它仍然不起作用 – schmimona 2011-06-15 17:35:42

3

你要確保一些東西都很到位:

  1. setupUi
  2. connect成功
  3. 真正改變

首先

  • 複選框值,我不知道看你在哪裏打電話setupUi。你要做到這一點在構造函數中:

    PaintWidget::PaintWidget(QWidget *parent) : 
         QWidget(parent), 
         ui(new Ui::PaintWidget) 
    { 
        ui->setupUi(this); 
        connect(ui->selectionModeCheckBox, 
         SIGNAL(toggled(bool)), this, SLOT(setSelectionMode(bool))); 
    } 
    

    其次,確保的connect返回值表明它成功了。

    第三,我相信你手動點擊複選框,但測試你可以做的緣故,在你的構造的連接後:

    ui->selectionModeCheckBox->setChecked(true); 
    
  • +0

    setupUi在我的代碼中。我只是忘了它。在我的構造函數中連接完成後,我將該框設置爲選中狀態,並在應用程序打開時檢查它。並且在調試器中用於連接它只表示。當我在調試時手動點擊我的用戶界面上的框時,它不會執行任何操作;它不會去連接。 – schmimona 2011-06-15 18:29:10

    +0

    調試器不會去連接。所有連接都是在發送者和接收者之間建立連接。 'connect'是否成功?如果你添加'CONFIG + = debug',你應該能夠進入大部分內容並看到事件發出。 – 2011-06-15 19:13:48

    +2

    是的。它成功了。我發現了錯誤。消息框的執行功能丟失。 – schmimona 2011-06-15 20:26:47

    0

    好,我經常用在對話的複選框( settingDialog,selectionDialog等),所以在這種情況下不需要信號槽,只需在點擊「OK」按鈕時檢查複選框的狀態,然後在accept函數中處理它。在你的情況下,我不認爲複選框是一個不錯的選擇。