2010-06-28 23 views
8

Tengo una pregunta muy relacionada con otra pregunta que he visto aquí, pero cuando intenté hacer mi pregunta, no obtuve ninguna respuesta. Espero hacer una pregunta nueva que alguien pueda hacer. ayúdame. Básicamente, simplemente quiero copiar una parte de mi tabla que he creado para poder pegarla en un archivo de Excel. Aquí es lo que tengo:Copiando parte de QTableView

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); 

Esto copiará una fina columna, pero cuando intento copiar una fila o decir un 2x2 subtabla el índice de la fila se cometa un error, asignar incorrectamente el índice de la fila de los valores. ¿Alguna idea?

Respuesta

13

Bueno, ya lo descubrí, lo siento a alguien que perdió su tiempo y miró.

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); 

}

4

escribí algo de código en base a Phil para copiar la selección cuando el usuario teclea Control-C.

I subclase QTableWidget y hicieron caso omiso 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); 
    } 
} 

ejemplo de salida (separados por tabuladores):

foo bar baz qux 
bar baz qux foo 
baz qux foo bar 
qux foo bar baz 
+0

A bien, listo para usar fragmento de código. +1 especialmente para la qSort de las celdas. Eso me habría hecho tropezar por un tiempo – Mizmor

+1

Desde http://stackoverflow.com/questions/1230222/selected-rows-line-in-qtableview-copy-to-qclipboard: puedes usar event-> matches (QKeySequence :: Copiar) en lugar de verificar manualmente ctrl + c – Legolas

+0

Ah, eso suena mejor –