2012-01-30 71 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