所以我有一个与我在这里看到的另一个问题非常密切相关的问题,但当我尝试在那里提出我的问题时,我没有得到任何答复,我希望将这个问题作为一个新问题,有人可以帮助我。基本上我只想复制我创建的表的一部分,以便将其粘贴到excel文件中。这就是我所拥有的:
QAbstractItemModel *abmodel = ui.tableview->model();
QItemSelectionModel *model = ui.tableview->selectionModel();
QModelIndexList list = model->selectionIndexes();
qSort(list);
QModelIndex index = list.first();
for(int i = 0; i < list.size(); i++)
{
QModelIndex index = list.at(i);
QString text = abmodel->data(index).toString();
copy_table.append(text);
if(index.row() != previous.row())
{
copy_table.append('\n');
}
else
{
copy_table.append('\t');
}
previous = index;
}
QClipboard *clipboard = QApplication::clipboard();
clipboard->setText(copy_table);
这将复制一个列,但是当我尝试复制一行或说一个2x2子表时,行索引会搞乱,错误地为值指定行索引。有什么想法吗?
答案 0 :(得分:13)
嗯,已经弄明白了,对不起任何浪费时间和看的人。
void TestCopyTable::on_pushButton_copy_clicked()
{
QAbstractItemModel *abmodel = ui.tableView->model();
QItemSelectionModel * model = ui.tableView->selectionModel();
QModelIndexList list = model->selectedIndexes();
qSort(list);
if(list.size() < 1)
return;
QString copy_table;
QModelIndex last = list.last();
QModelIndex previous = list.first();
list.removeFirst();
for(int i = 0; i < list.size(); i++)
{
QVariant data = abmodel->data(previous);
QString text = data.toString();
QModelIndex index = list.at(i);
copy_table.append(text);
if(index.row() != previous.row())
{
copy_table.append('\n');
}
else
{
copy_table.append('\t');
}
previous = index;
}
copy_table.append(abmodel->data(list.last()).toString());
copy_table.append('\n');
QClipboard *clipboard = QApplication::clipboard();
clipboard->setText(copy_table);
}
答案 1 :(得分:4)
我写了一些基于Phil的代码,当用户键入Control-C时复制选择。
我已将QTableWidget
分组并覆盖keyPressEvent()
:
void MyTableWidget::keyPressEvent(QKeyEvent* event) {
// If Ctrl-C typed
// Or use event->matches(QKeySequence::Copy)
if (event->key() == Qt::Key_C && (event->modifiers() & Qt::ControlModifier))
{
QModelIndexList cells = selectedIndexes();
qSort(cells); // Necessary, otherwise they are in column order
QString text;
int currentRow = 0; // To determine when to insert newlines
foreach (const QModelIndex& cell, cells) {
if (text.length() == 0) {
// First item
} else if (cell.row() != currentRow) {
// New row
text += '\n';
} else {
// Next cell
text += '\t';
}
currentRow = cell.row();
text += cell.data().toString();
}
QApplication::clipboard()->setText(text);
}
}
输出示例(制表符分隔):
foo bar baz qux
bar baz qux foo
baz qux foo bar
qux foo bar baz
答案 2 :(得分:0)
关于cdline: qSort(cells); //必要,否则按列顺序 当前(20190118)它带来一个警告: Warnung:已弃用“ qSort>”:使用std :: sort
所以我的解决方案用以下方式替换行: std :: sort(cells.begin(),cells.end()); 编译,运行OK->到目前为止一切顺利。但是问题:这个cdline的好处? 我发现没有人。用gui的副本进行了几次测试,并将其解析为excel。即使使用2x2或其他XxY场景,一切都很好。