QTableView编译报错:候选函数需6个实参,传入0/1个
我正在开发一个包含6列的QTableView,打算通过调用对话框来插入特定值。但编译项目时,在文件itemcameracalibrationdata.h中遇到了两个错误提示:
note: candidate expects 6 arguments, 0 provided
note: candidate expects 6 arguments, 1 provided
问题根源分析
这俩错误其实把问题说的明明白白——你在创建ItemCameraCalibrationData类的实例时,传入的参数数量完全不匹配类构造函数的要求。要么你直接空着手创建实例(传了0个参数),要么只传了1个,但这个类的构造函数明确要求必须给6个参数才行。
结合你给出的头文件开头代码,大概率是你在ItemCameraCalibrationData类里只定义了一个需要6个参数的构造函数,而且没有提供无参构造函数(C++里如果自定义了带参数的构造函数,编译器不会自动生成无参的),所以当你用new ItemCameraCalibrationData()或者只传1个参数创建对象时,编译器找不到对应的构造函数,就报错了。
具体解决步骤
1. 先确认构造函数的定义
打开itemcameracalibrationdata.h,找到ItemCameraCalibrationData类的构造函数声明,它应该长这样:
class ItemCameraCalibrationData : public QObject { Q_OBJECT public: // 明确要求6个参数的构造函数 explicit ItemCameraCalibrationData(/* 参数1类型 参数1, 参数2类型 参数2, ..., 共6个参数 */, QObject *parent = nullptr); };
如果这里没有一个不带参数(或者所有参数都有默认值)的构造函数,那你就不能直接空参数创建实例。
2. 修正实例化代码,传够6个参数
既然你的QTableView有6列,那对话框里肯定是用来输入这6列对应的数据的。你需要从对话框里把这6个值取出来,然后完整传入构造函数。举个例子:
// 假设对话框里有6个输入框,分别对应6列数据 QString col1Val = ui->dlg->lineEdit_col1->text(); int col2Val = ui->dlg->lineEdit_col2->text().toInt(); double col3Val = ui->dlg->lineEdit_col3->text().toDouble(); QString col4Val = ui->dlg->comboBox_col4->currentText(); bool col5Val = ui->dlg->checkBox_col5->isChecked(); float col6Val = ui->dlg->spinBox_col6->value(); // 用这6个值创建实例 ItemCameraCalibrationData *calibItem = new ItemCameraCalibrationData(col1Val, col2Val, col3Val, col4Val, col5Val, col6Val); // 之后把这个数据项添加到你的QTableView模型里就行
这里要注意参数的顺序和类型必须和构造函数声明的完全一致,不然还会报类型不匹配的错误。
3. 可选:如果需要空实例,添加无参构造函数
如果你确实有场景需要先创建一个空的实例,后续再赋值,那可以在类里添加一个无参构造函数:
// 头文件里的类声明中添加 explicit ItemCameraCalibrationData(QObject *parent = nullptr); // 对应的cpp文件实现 ItemCameraCalibrationData::ItemCameraCalibrationData(QObject *parent) : QObject(parent) { // 这里可以给6个成员变量设置默认值,比如空字符串、0之类的 }
不过这种方式要记得后续一定要把6个数据都赋值完整再放到QTableView里,不然会出现空数据或者异常。
额外小提示
如果你用的是QStandardItemModel来给QTableView提供数据,其实也可以直接用QStandardItem来逐个创建列数据,不一定非要自定义这个ItemCameraCalibrationData类。但如果是你自己写的自定义模型(比如继承QAbstractTableModel),那这个自定义数据类的构造就必须严格符合参数要求,才能正确给模型提供数据。
内容的提问来源于stack exchange,提问作者user9174145

