我正在学习qt --在书中,使用Qt4进行C++图形用户界面编程,我试图让所有的代码都能工作。在将选择的内容从自定义表小部件转换为纯文本时,我遇到了问题。
这本书中的现有代码:
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可能是未知类型的。
发布于 2014-08-11 23:44:00
首先,重嵌套括号很难读懂。我建议将冒犯的行分成几行。其次,从QTableWidgetItem::data返回的类型是QVariant,可以使用QVariant::toString()成员函数将其转换为QString。而且,我不认为i*(range.columnCount()-1)正是你想要的。
鉴于此,您的代码应该如下所示:
int index = i*range.columnCount()+j;
QTableWidgetItem* item = items.at(index);
str += item->data(Qt::DisplayRole).toString();https://stackoverflow.com/questions/25253534
复制相似问题