c++ - QTableWidget से सभी पंक्तियों को कैसे हटाएं




(7)

मैं QTableWidget से सभी पंक्तियों को हटाने की कोशिश कर रहा QTableWidget । मैंने कोशिश की है।

for ( int i = 0; i < mTestTable->rowCount(); ++i )
{
    mTestTable->removeRow(i);
}

मेरी मेज में दो पंक्तियां थीं। लेकिन यह सिर्फ एक पंक्ति को हटा दिया। एक कारण यह हो सकता है कि मैंने तालिका को एक निश्चित तालिका आकार के साथ नहीं बनाया है। rowCount() लिए क्यूटी दस्तावेज़ीकरण कहता है,

इस संपत्ति में तालिका में पंक्तियों की संख्या है।

डिफ़ॉल्ट रूप से, पंक्ति और स्तंभ गणना के बिना निर्मित तालिका के लिए, इस संपत्ति में 0 का मान होता है।

तो अगर ऐसा है, तो तालिका से सभी पंक्तियों को हटाने का सबसे अच्छा तरीका क्या है?


AFAIK setRowCount(0) कुछ भी नहीं हटाता है। ऑब्जेक्ट्स अभी भी वहां हैं, लेकिन कोई और दिखाई नहीं दे रहा है।

yourtable->model()->removeRows(0, yourtable->rowCount());

आप अपने QTableView (myTableView) में केवल खाली आइटम मॉडल (QStandardItemModel) जोड़ सकते हैं:

itemModel = new QStandardItemModel;
ui->myTableView->setModel(itemModel);

इस पोस्ट को देखें: http://forum.qt.io/topic/1715/qtablewidget-how-to-delete-a-row

QList<QTableWidgetItem*> items = table.findItems(.....);
QMap<int, int> rowsMap;
for(int i = 0; i < items.count(); i++{
  rowsMap[items.at(i).row()] = -1; //garbage value
}
QList<int> rowsList = rowsMap.uniqueKeys();
qSort(rowsList);

//Now go through your table and delete rows in descending order as content would shift up and hence cannot do it in ascending order with ease.
for(int i = rowList.count() - 1; i >= 0; i--){
  table.removeRow(rowList.at(i));
}

ऐप क्रैश को रोकने के लिए, QTableView से सभी सिग्नल डिस्कनेक्ट करें।

// Deselects all selected items
ui->tableWidget->clearSelection();

// Disconnect all signals from table widget ! important !
ui->tableWidget->disconnect();

// Remove all items
ui->tableWidget->clearContents();

// Set row count to 0 (remove rows)
ui->tableWidget->setRowCount(0);

बस पंक्ति गणना 0 के साथ सेट करें:

mTestTable->setRowCount(0);

यह removeRows को कॉल करके स्वचालित रूप से QTableWidgetItem को हटा देगा removeRows कि आप QTableWidget आंतरिक मॉडल कोड में देख सकते हैं:

void QTableModel::setRowCount(int rows)
{
    int rc = verticalHeaderItems.count();
    if (rows < 0 || rc == rows)
        return;
    if (rc < rows)
        insertRows(qMax(rc, 0), rows - rc);
    else
        removeRows(qMax(rows, 0), rc - rows);
}

मुझे QTableWidget नहीं पता है लेकिन आपके कोड में एक तर्क दोष लगता है। आप भूल रहे हैं कि जब आप लूप के चारों ओर जाते हैं तो आप mTestTable->rowCount() के मान को कम कर रहे हैं। एक पंक्ति को हटाने के बाद, i एक होगा और mTestTable->rowCount() भी एक होगा, इसलिए आपका लूप रुक जाएगा।

मैं इसे इस तरह करूँगा

while (mTestTable->rowCount() > 0)
{
    mTestTable->removeRow(0);
}

QTableWidget test;
test.clear();
test.setRowCount( 0);




qtablewidget