我正在学习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可能是未知类型。
答案 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();