2011-06-15 126 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函数中处理它。在你的情况下,我不认为复选框是一个不错的选择。