2010-06-28 1 views
8

Quindi ho una domanda strettamente correlata a un'altra domanda che ho visto qui ma quando ho provato a porre la mia domanda non ho ricevuto risposte, spero che questa sia una nuova domanda che qualcuno può aiutarmi. Fondamentalmente voglio semplicemente copiare una parte del mio tavolo che ho creato in modo che possa incollarlo in un file excel. Ecco quello che ho:Copia di parte di 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); 

Questo copierà una multa di colonna, ma quando tento di copiare una riga o dire una 2x2 sottotabella l'indice di riga viene incasinato, assegnando in modo non corretto l'indice di riga per i valori. qualche idea?

risposta

13

Beh, l'ho già capito, mi dispiace chiunque abbia perso tempo e aspetto.

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

ho scritto un codice in base a Phil per copiare la selezione quando l'utente digita Control-C.

I subclassata QTableWidget e overrode 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); 
    } 
} 

esempio uscita (separati da tabulazioni):

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

A fine, pronto all'uso frammento di codice. +1 in particolare per il qSort delle celle. Questo mi avrebbe fatto inciampare per un po 'di tempo – Mizmor

+1

Da http://stackoverflow.com/questions/1230222/selected-rows-line-in-qtableview-copy-to-qclipboard: puoi usare event-> matches (QKeySequence :: Copia) invece di controllare manualmente per ctrl + c – Legolas

+0

Ah che suona meglio –