2016-02-10 58 views
2

我正在使用此代碼來查詢sqlite並將結果放在QTableView中。QTableView中的Qt複選框

//MainWindow.cpp 
void MainWindow::on_pushButton_clicked() 
{ 
    QSqlQueryModel * modal=new QSqlQueryModel(); 
    connOpen(); 
    QSqlQuery* qry=new QSqlQuery(mydb); 

    qry->prepare("select * from database"); 
    qry->exec(); 

    modal->setQuery(*qry); 

    //from stack 
    modal->insertColumn(0); 

    ui->tableView->setModel(modal); 

    //from stack 
    ui->tableView->resizeColumnsToContents(); 

    int p; 
    for(p=0; p<modal->rowCount(); p++) 
    { 
     ui->tableView->setIndexWidget(modal->index(p,0),new QCheckBox()); 
    } 

    connClose(); 
    qDebug() <<(modal->rowCount()); 
} 

我已經看到了幾個網絡用於添加複選框到列的例子,但我不太清楚爲我的簡單例子使用什麼。

  • answer建議幾行似乎不標準。
  • 還有更多的例子,如thisthis one,似乎概述了我所需要的,但不清楚你放置代碼的位置。

我打算做的是讓列1可檢查。在下一個btn按下,如果選中那些數據行被寫入文件。

我仍然需要了解如何循環選定的數據,或者我需要獲取檢查行的ID並做另一個查詢。

問題:

  • 你如何添加編輯複選框的1列QTableView中?
  • 如何遍歷QTableView數據中的值,因此可以訪問檢查行的值?
  • 如何檢查全部/無?

回答

2

我認爲擁有一列可選單元格的最佳方法是創建您的物品模型,例如,通過分類QSqlQueryModel。 您必須重新實現flags()方法來檢查單元格。

此外,您還需要重新實現data()方法以返回檢查狀態和setData()方法並設置檢查狀態。您必須實現自己的邏輯來跟蹤每行的檢查狀態(例如,使用Qt :: CheckState數組,您必須在模型數據更改時初始化和調整大小)。

宥可以像這樣開始:

class MyModel : public QSqlQueryModel 
{ 
public: 

    Qt::ItemFlags flags(const QModelIndex & index) const 
    { 
     if(index.column() == 0) 
      return QSqlQueryModel::flags(index) | Qt::ItemIsUserCheckable; 
     return QSqlQueryModel::flags(index); 
    } 

    QVariant data(const QModelIndex & index, int role = Qt::DisplayRole) const 
    { 
     if(index.column() == 0 && role == Qt::CheckStateRole) 
     { 
      //implement your logic to return the check state 
      //.... 
     } 
     else 
      return QSqlQueryModel::data(index, role); 
    } 

    bool setData(const QModelIndex & index, const QVariant & value, int role = Qt::EditRole) 
    { 
     if(index.column() == 0 && role == Qt::CheckStateRole) 
     { 
      //implement your logic to set the check state 
      //.... 
     } 
     else 
      QSqlQueryModel::setData(index, value, role); 
    } 
}; 

硒也:

+0

這段代碼放在MainWindow.cpp文件? – rrrfusco

+0

你可以把它放在任何你想要的地方,從MainWindow.cpp中可以看到它就足夠了。如果你不熟悉類定義和頭文件的使用,也許你應該學習更多關於C++的知識。而且,這僅僅是一個從其開始的代碼示例,並不完整。比obvioulsy你必須使用MyModel而不是你的MainWindow.cpp中的QSqlQueryModel – Fabio