2010-06-28 17 views
8

Burada gördüğüm başka bir soruyla çok yakından ilgili bir sorum var ama sorumu yanıtlamaya çalıştığımda hiç yanıt almadım, bunu birilerinin yeni bir soru olarak sormasını umuyorum bana yardım et. Temel olarak, oluşturduğum tablonun bir kısmını kopyalayıp bir excel dosyasına yapıştırabilmeyi istiyorum.QTableView öğesinin kopyalanması

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

Bu sütun cezası kopyalar, ama ben bir satır kopyalamak veya söylemek çalıştığınızda bir 2x2 yanlış değerler için satır endeksini atama satır dizini berbat olur alt tablo: İşte ne var. Düşüncesi olan var mı?

cevap

13

Zaten çoktan anladım, zamanlarını boşa harcayan ve bakılan herkese üzgünüm.

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

Ben seçimi kullanıcı türleri Control-C kopyalamak için Phil'in dayalı bazı kod yazdım.

I QTableWidget sınıflandırma ve keyPressEvent() overrode:

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

çıkış örneği (sekme ayrılmış):

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

ince, kullanıma hazır ekleyerek yapılabilir. Özellikle hücrelerin qSort için +1. Bu beni bir süre için tetiklemişti – Mizmor

+1

http://stackoverflow.com/questions/1230222/selected-rows-line-in-qtableview-copy-tocqboard adresinden: event-> kibritleri kullanabilirsiniz (QKeySequence :: Kopyalama) ctrl + c – Legolas

+0

Ah için daha iyi kılan yerine –

İlgili konular