从'QTableWidgetItem * const'转换为'QChar'..或QString ...是不明确的

时间:2014-08-11 22:36:58

标签: c++ qt type-conversion qstring

我正在学习qt - 在C ++ GUI Programming With Qt 4一书中,我试图让所有代码都能正常工作。我将选择的内容从自定义表格小部件转换为纯文本时遇到问题。

书中的现有代码:

void MyTableWidget::mouseMoveEvent(QMouseEvent *event)
{
    if (event->buttons() & Qt::LeftButton) {
        int distance = (event->pos() - startPos).manhattanLength();
        if (distance >= QApplication::startDragDistance())
            performDrag();
    }
    QTableWidget::mouseMoveEvent(event);
}
void MyTableWidget::performDrag()
{
    QString plainText = selectionAsPlainText();
    if (plainText.isEmpty())
        return;

    QMimeData *mimeData = new QMimeData;
    mimeData->setText(plainText);
    mimeData->setHtml(toHtml(plainText));
    mimeData->setData("text/csv", toCsv(plainText).toUtf8());

    QDrag *drag = new QDrag(this);
    drag->setMimeData(mimeData);
    if (drag->exec(Qt::CopyAction | Qt::MoveAction) == Qt::MoveAction)
        deleteSelection();
}

我正在尝试编写selectionAsPlainText()和deleteSelection()。

QTableWidgetSelectionRange MyTableWidget::selectedRange() const
{
    QList<QTableWidgetSelectionRange> ranges = selectedRanges();
    if (ranges.isEmpty())
        return QTableWidgetSelectionRange();
    return ranges.first();
}

QString MyTableWidget::selectionAsPlainText()
{
    QTableWidgetSelectionRange range = selectedRange();
    QList<QTableWidgetItem *> items = selectedItems();
    QString str;

   for (int i=0;i<range.rowCount();i++){
       for (int j=0;j<range.columnCount();j++){


// error on this line
               str+=QString(items.at(i*(range.columnCount()-1)+j)->data(Qt::DisplayRole)));


           if (j!= range.columnCount()-1)
                str += "\t";
       }
       str += "\n";
    }
    return str;
}

在此次尝试中,我尝试将QTableWidgetItem中的项目放在QString中,由"\t""\n"分隔。

我无法尝试任何类型的此类操作,因为我在尝试将任何内容放入QString时遇到错误。

到目前为止我尝试的所有内容都给出了一个像

这样的错误
conversion from 'QTableWidgetItem* const' to 'QChar' is ambiguous
 or
error: no matching function for call to 'QString::QString(QVariant)'

我不知道如何进行此类型转换,我还没有看到如何指定类型转换的示例...虽然我理解它,选择数据的Qt :: DisplayRole,我应该隐式地有一个QString ...

如何进行此类型转换?

我添加了更多代码来表明TableWidget可能是未知类型。

1 个答案:

答案 0 :(得分:1)

首先,重度嵌套的括号很难阅读。我建议将违规行分成几行。其次,从QTableWidgetItem::data返回的类型是QVariant,可以使用QString成员函数将其转换为QVariant::toString()。另外,我不认为i*(range.columnCount()-1)是你想要的。

鉴于此,您的代码应如下所示:

int index = i*range.columnCount()+j;
QTableWidgetItem* item = items.at(index);
str += item->data(Qt::DisplayRole).toString();