QTableWidget;使用 celllChanged 信号

Posted

技术标签:

【中文标题】QTableWidget;使用 celllChanged 信号【英文标题】:QTableWidget; Using the celllChanged signal 【发布时间】:2012-01-30 18:21:33 【问题描述】:

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

> 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);
    


这个问题可能是由我没有看到的一些简单问题引起的。感谢您提供的任何帮助。请只留下建设性的反馈,因为我只对改进和实现我的目标感兴趣。在这方面,我感谢所有帮助并感谢您阅读本文的尝试。

【问题讨论】:

我在 Qt 方面没有那么丰富的经验,但问题可能出在参考文献上。您是否尝试重写 addWeightSum 以获取按值而不是引用传递的参数? 确实我做到了,同样的问题..这让我觉得应用程序甚至没有那么远。因为我应该对这些参数方法之一有错误 你清理项目了吗?也许您的构建环境被引入错误的旧二进制文件污染了。虽然这不太可能。 我同意没人同意。有时你如果不从头开始重建 Qt 可能会带来一些意想不到的惊喜。 在插槽中通过引用传递参数在使用连接时毫无用处...... 【参考方案1】:

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

【讨论】:

我看不出签名的不同之处;我还认为我需要引用这个值,因为它起源于 cellchanged 信号。我确实删除了我的 & 并在编译之前运行了一次清理,每次启动对话框时我仍然收到相同的应用程序输出。 这让我很惊讶,你能发布更新的标题吗 我实际上解决了这个问题;问题是连接语句中的参数。由于某种原因,它仅适用于两组参数中的 int、int。奇怪的。感谢您的帮助。

以上是关于QTableWidget;使用 celllChanged 信号的主要内容,如果未能解决你的问题,请参考以下文章

我应该使用啥,QTableWidget 或 QTableView? [复制]

QTableWidget

QTableWidget;使用 celllChanged 信号

QTablewidget 简单例子

QTableWidget控件学习

QTableWidget 中的自定义排序