2012-01-30 134 views
1

我是一名使用Qt开发工作GUI的学生程序员,并且使用QTableWidget遇到了问题。我有一个由这个小部件制作的电子表格,它将不同的值作为用户输入。我在这个电子表格之外有一个QLineedit字段,它需要显示第9列中任何值的总和。在这种情况下,我认为最好使用cellchanged signal将第9列添加到一起,并显示将linedit字段设置为所有这些单元格的总和。我的问题是,当我去执行我的应用程序收到以下应用程序的输出,这部分我的GUI不工作:QTableWidget;使用celllChanged信号

> Object::connect: No such slot InjectionDialog::addWeightSum(int,int) 
> Object::connect: (sender name: 'tableWidgetInjectionLocations') 
> Object::connect: (receiver name: 'InjectionDialog') 

我已经确定了多次,这个插槽是否确实存在,并且被正确地调用尽我所知。然而,我是一名学生,也许我不对,现在我在这里。

我的InjectionDialog.h包含以下插槽;

private slots: 
    void accepted_Clicked(); 
    void cancel_Clicked(); 
    void useFluidiFileRdoBtn_Clicked(); 
    void useFluidSpecifiedValuesRdoBtn_Clicked(); 
    void useParticleiFileRdoBtn_Clicked(); 
    void useParticleSpecifiedValuesRdoBtn_Clicked(); 
    void particleInjectionRdoBtn_Clicked(); 
    void liquidDropletsRdoBtn_Clicked(); 
    void addWeightSum(int &row, int &col); 

我的injectiondialog.cpp包含以下内容。

InjectionDialog::InjectionDialog(QWidget *parent) : 
    QDialog(parent), 
    ui(new Ui::InjectionDialog) 
{ 
    ui->setupUi(this); 
    connect(ui->pushButtonAccept, SIGNAL(clicked()), this, SLOT(accepted_Clicked())); 
    connect(ui->pushButtonCancel, SIGNAL(clicked()), this, SLOT(cancel_Clicked())); 
    connect(ui->radioButtonUseiFileFluidInjection, SIGNAL(clicked()), this, SLOT(useFluidiFileRdoBtn_Clicked())); 
    connect(ui->radioButtonUseSpecifiedValuesFluidInjection, SIGNAL(clicked()), this, SLOT(useFluidSpecifiedValuesRdoBtn_Clicked())); 
    connect(ui->radioButtonUseiFileParticleInjection, SIGNAL(clicked()), this, SLOT(useParticleiFileRdoBtn_Clicked())); 
    connect(ui->radioButtonUseSpecifiedValuesParitcleInjection, SIGNAL(clicked()), this, SLOT(useParticleSpecifiedValuesRdoBtn_Clicked())); 
    connect(ui->tableWidgetInjectionLocations, SIGNAL(cellChanged(int,int)), this, SLOT(addWeightSum(int &row, int &col))); 

我的注入对话框还包括添加此列的函数;其计算方法如下:

void InjectionDialog::addWeightSum(int &row, int &col) 
{ 
    double weightSum; 
    double totalWeightSum; 
    QString tempstr; 
    bool check; 
    if(col == 9) 
    { 
     for (int i = 0; i < ui->tableWidgetInjectionLocations->rowCount(); i++) 
     { 
      if (ui->tableWidgetInjectionLocations->item(i,9)->text() != "") 
      { 
       tempstr = ui->tableWidgetInjectionLocations->item(i,9)->text(); 
       weightSum = tempstr.toDouble(&check); 
       if(check == false) 
       { 
        ui->lineEditWeightSum->setText("Error"); 
        break; 
       } 
       else 
       { 
        totalWeightSum += weightSum; 
       } 
      } 
     } 
     ui->lineEditWeightSum->clear(); 
     tempstr.append(QString("%1").arg(totalWeightSum)); 
     ui->lineEditWeightSum->setText(tempstr); 
    } 

} 

这个问题可以通过一些简单的,我只是没有看到所致。我很感激您可以提供的任何帮助。请仅留下建设性的反馈意见,因为我只对改善和完成我的目标感兴趣。在这方面,我感谢所有帮助和感谢您阅读本文的尝试。

+1

我不是那种Qt的经验,但也许问题是参考。您是否尝试重写addWeightSum以获取通过值而不是引用传递的参数? – Nobody 2012-01-30 18:26:58

+0

的确,我确实,同样的问题..这让我觉得应用程序甚至没有那么远。因为我应该有这些参数方法之一的错误 – 2012-01-30 18:33:04

+3

您是否清理该项目?也许你的编译环境受到旧的二进制文件的污染,这些二进制文件会引入错误。虽然这是不太可能的。 – Nobody 2012-01-30 18:35:55

回答

2

您表示信号槽签名不同。在您的void addWeightSum(int &row, int &col); 的声明中,您已经提供了参考。删除它们。 void addWeightSum(int row, int col);

+0

我看不到签名的不同位置;我也有这个想法,我需要引用这个值,因为它源于cellchanged信号。我确实删除了我的&,并在编译之前运行了一次清理,并且每次启动对话时仍然收到相同的应用程序输出。 – 2012-01-30 19:08:42

+1

这会让我感到惊讶,你可以发布你的班级更新头文件 – Neox 2012-01-30 19:32:16

+0

我真的解决了这个问题;问题是connect语句中的参数。出于某种原因,它只能在两组参数中使用int,int。奇怪。谢谢你的帮助。 – 2012-01-30 23:01:09