1

我想为我实现一个自定义排序,QTableWidget所以我子类QTableWidgetItem化并重新实现了这个operator<()函数。

class FloatFieldTableItem : public QTableWidgetItem
{
public:
    FloatFieldTableItem(qreal theFloat) :
    QTableWidgetItem(),
    _float(theFloat)
    {}

    virtual bool operator<(FloatFieldTableItem const &other) const
    {
        return _float < other.float;
    }

private:
    qreal _float;
};

但是由于某种原因,该operator<()函数甚至从未被调用!

tableWidget->setItem(0, 0, new FloatFieldTableItem(0.1));
tableWidget->setItem(1, 0, new FloatFieldTableItem(0.3));
tableWidget->setItem(2, 0, new FloatFieldTableItem(6.1));
// This should result in a call to the operator<() function above
tableWidget->sortItems(0);
4

1 回答 1

1

您的签名与 的签名operator<()不匹配QTableWidgetItem,因此即使它已被声明为虚拟,它也不会vtable以允许您QTableWidget调用它的方式进入。

signature将 aQTableWidgetItem作为参数,因此您必须将其强制转换为您想要做的事情。operator<()QTableWidgetItemFloatFieldTableItem

virtual bool operator<(QTableWidgetItem const &other) const
{
    FloatFieldTableItem const *item
        = dynamic_cast<FloatFieldTableItem const*>(&other);
    if(item)
    {
        return _float < item->_float;
    }
    else
    {
        return QTableWidgetItem::operator<(other);
    }
}
于 2013-07-30T19:02:53.430 回答