我不知道是否可以将QVariant转换为自定义(非QObject)类常量指针;例如具有CCD_ 1功能。
官方文件显示:
调用canConvert()以确定是否可以转换类型。如果值无法转换,默认构造的值将返回。
这是我的密码;它位于QComboBox的一个子类中,我正试图检索当前数据并将其转换为const MyClass*
:
QVariant var = currentData(); // of the QComboBox
const MyClass* myObject = NULL;
if(var.canConvert<const MyClass *>())
{
cout << "Conversion possible" << endl;
myObject = var.value<const MyClass*>();
}
else
cout << "Conversion impossible!!" << endl;
if(f == NULL)
cout << "null pointer!!" << endl;
else if(myObject->getMyProperty() == 0)
cout << "MyProperty is zero!" << endl;
我已声明:
Q_DECLARE_METATYPE(const MyClass*)
在MyClass标头中。在输出中,我在创建QComboBox时得到"Conversion possible"
,然后是"Conversion impossible!!" "null pointer!!"
,然后,当我实际调用代码段中的函数时,我得到的只是:
"Conversion possible"
"MyProperty is zero!"
MyProperty=0是在MyClass的默认构造函数中设置的。QComboBox中的所有MyClass值都将myProperty设置为不同于0的值。
我的问题是:如果转换是可能的,那么为什么创建的指针指向默认构造的值?
编辑:以下是所需的一些其他重要代码;QComboBox初始化。
void MainWindow::prepareObjects()
{
comboBox = new MyComboBox(this); // this is a member variable and MyComboBox inherits from QComboBox
ObjectList ol; // contains a map of objects already defined
map<QString, const MyClass*> themap = ol.getObjects();
for(map<QString, const MyClass*>::iterator it = themap.begin(); it != themap.end(); ++it)
{
const MyClass myObject = *it->second;
QIcon icon(QPixmap(":/images/objects/" + it->first + ".png"));
comboBox->addItem(icon, myObject.getName(), QVariant::fromValue(&myObject));
}
comboBox->show();
}
与我想象的不同,问题是在QComboBox初始化中(用相应代码编辑的问题)。第一段代码(QVariant cast)运行良好。
将项目从地图添加到QComboBox的正确方法是:
void MainWindow::prepareObjects()
{
comboBox = new MyComboBox(this);
ObjectList ol;
map<QString, const MyClass*> themap = ol.getObjects();
for(map<QString, const MyClass*>::iterator it = themap.begin(); it != themap.end(); ++it)
{
const MyClass* myObject = it->second; // SAME TYPE AS IN THE MAP AND COMBOBOX
QIcon icon(QPixmap(":/images/objects/" + it->first + ".png"));
comboBox->addItem(icon, myObject->getName(), QVariant::fromValue(myObject)); // no '&'
}
comboBox->show();
}
我的地图和QComboBox存储MyClass*
项目。我基本上有一个类型为MyClass
(无指针)的中间变量,在其中我将对象的值存储在映射中,然后我为QComboBox获取它的地址。这在组合框中创建了一个野生指针,其中0或随机(巨大)数字作为对象的Integer成员变量,而Segmentation Fault用于QString变量。
我仍然不明白的是,当我在插入QComboBox后尝试直接访问它们时,它们中的值仍然是正确的。问题发生在初始化方法之外的MyComboBox插槽中;这就是问题中的第一段代码的来源。
所以我仍然没有一个确切的答案:
如果转换是可能的,那么为什么指针创建的点到默认构造值?
除了我认为默认构造的值是一个通配符或悬挂指针。