2013-09-28 77 views
0

這應該如何通過使用model-> setData()方法調用完成?QTableView:如何在程序中編輯不可編輯的單元格?

我已經獲得的來自QStandardItemModel稱爲「MyStandardItemModel」級。通過覆蓋受保護的虛擬標記方法,我使第三列和第四列不可編輯。這是怎麼回事:

#define TX_PACKET_COLUMN (4u) 
#define RX_PACKET_COLUMN (5u) 

Qt::ItemFlags MyStandardItemModel::flags(const QModelIndex& index) const 
{ 
    if (index.column() == TX_PACKET_COLUMN || index.column() == RX_PACKET_COLUMN) 
    { 
     return (QStandardItemModel::flags(index) & ~Qt::ItemIsEditable); 
    } 
    else 
    { 
     return QStandardItemModel::flags(index); 
    } 
} 

... 

//Set model 
ui->testCaseTableView->setModel(model); 

這樣做,我不能編輯第三和第四列中的單元格。

現在,我想,當我雙擊這些細胞,彈出對話框出現。我將在該對話框的可編輯字段中修改一些數據,然後將其複製回代碼中的不可編輯單元格。

我想只寫了一個QTreeView則雙擊()處理,只是一些數據複製到細胞只是爲了看看是否有可能將數據複製到不可編輯的細胞。

此操作失敗,數據不寫入不可編輯的單元格。

在這裏你可以找到雙擊處理程序:

void MainWindow::on_testCaseTableView_doubleClicked(const QModelIndex &index) 
{ 
    QVariant variant; 
    variant.toString() = "AA"; 

    if((index.column() == TX_PACKET_COLUMN)||(index.column() == RX_PACKET_COLUMN)) 
    { 
     model->setData(index, variant); // set new value 
    } 

} 

使用setData(..)操作是在細胞清除已寫入的數據,但串「AA」是沒有得到寫入。請建議如何將一些數據複製到代碼中的不可編輯單元格。

enter image description here

+0

爲什麼當它是關於表的時候,不會繼承QTIM而不是QAIM btw? – lpapp

+0

單元格是否可編輯不應影響您如何以編程方式設置和顯示值。答案可能在於models :: setData和:: data方法。我會調試這些。 – user2672165

+1

變體。toString()=「AA」; - >看起來不對,並且該錯誤將出現在您的模型子類的setData()實現中。你可以分享該代碼嗎?您在那裏正確發出數據更改信號? – lpapp

回答

0

正如我在我的評論指出,必須解決這個問題第一個問題:

代替:

QVariant variant; 
variant.toString() = "AA"; 

你應該寫

QVariant variant = QLatin1String("AA"); 

一般情況下,你會考慮使用setData(...)實現這樣的情況下你是否發射數據變更後的信號正確等等,但在這裏,你進入了一個問題,之前這可能會導致問題,所以讓我們修復這一點。

注意,你應該使用QLatin1String避免從原材料的char *到QString的不必要的顯式轉換。這是一個很好的習慣,這是Qt 4以及Qt 5中可用的。

雖然,您也可以使用QStringLiteral宏以非常高效的方式創建QString,並且使用模板魔法,這需要C++ 11。

+0

感謝Papp爲我工作。 – Katoch

2

的QVariant設置爲空。你的模型沒有什麼需要錯的。錯誤是在這條線:

variant.toString() = "AA"; 

變化:

QVariant variant("AA"); // just for testing anyway 
+0

感謝user2672165它爲我工作。 – Katoch

+1

@Lazlo Papp:如果你仔細閱讀過,你已經注意到它在問題中說:「setData(..)操作正在清除單元格中已寫入的數據」。我的邏輯沒有缺陷。我承認你先注意到了錯誤的一行。當我在花園裏時,我會想起它。應該承認你是的。我低估了你的回答,因爲在這種情況下專注於字符編碼是非常積極的。這是因爲在我看來,我自己意識到這一切,但我明白,如果你認爲我偷了你的想法。儘管如此,我似乎還是一直明白這一點。 – user2672165

相關問題