从QCombobox检索值失败-将QVariant强制转换为常量指针



我不知道是否可以将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插槽中;这就是问题中的第一段代码的来源。

所以我仍然没有一个确切的答案:

如果转换是可能的,那么为什么指针创建的点到默认构造值?

除了我认为默认构造的值是一个通配符或悬挂指针。

相关内容

  • 没有找到相关文章

最新更新