[英]QStyledItemDelegate partially select text of default QLineEdit editor
[英]QStyledItemDelegate - show button menu as soon as the editor is created
我有一個 QTableView,它顯示一個“顏色”列,用戶單擊該列,應創建一個帶有菜單的按鈕,該按鈕具有一個顏色選擇器小部件。 我在表格單元格上創建和顯示此按鈕沒有問題。 但我擔心的是,要進入顏色選擇器小部件並選擇正確的顏色,用戶必須點擊 3 次。
我想將其減少到兩次點擊,以便用戶應該能夠實現上述所有目標。 那是,
我試圖在 QStyledItemDelegate 覆蓋函數的不同位置調用 colorButton->showMenu() ,例如在像這樣的 setEditorData() 中。
void qDrawToolsDelegate_C::setEditorData(QWidget * editor, const QModelIndex & index) const
{
if (!index.isValid() || !editor) return;
const qDrawToolsModel_C * model = static_cast<const qDrawToolsModel_C *>(index.model());
if (!model) return;
if (model->columnType(index.column()) == COL_TYPE_COLOR) {
qColorButton_C * colorButton = static_cast<qColorButton_C *>(editor);
colorButton->setColor(_model->getColor(index));
colorButton->showMenu();
}
else QStyledItemDelegate::setEditorData(editor, index);
}
菜單顯示出來,但按鈕似乎沒有正確顯示。 我假設菜單在按鈕上的繪畫完成之前彈出。 見圖1(點擊紅色單元格)。
當彈出窗口關閉時,按鈕會正確繪制。 見圖2。
我不確定顯示彈出窗口如何阻止按鈕上的繪畫。 如果真的是因為這個,我可以考慮創建一個計時器,然后在計時器槽中調用 showMenu() 來解決這個問題。 但我喜歡你們關於如何更好地實現這一目標的建議。
PS:我只是 RTFM :)。 它說關於 showMenu() -“在用戶關閉彈出菜單之前,此函數不會返回。”
我的印象是,當 QStyledItemDelegate::setEditorData() 被調用時,它已經完全顯示了,我認為事實並非如此。 解決方案是在 setEditorData() 中添加一個單發計時器來調用 showMenu()。
void qDrawToolsDelegate_C::setEditorData(QWidget * editor, const QModelIndex & index) const
{
if (!index.isValid() || !editor) return;
const qDrawToolsModel_C * model = static_cast<const qDrawToolsModel_C *>(index.model());
if (!model) return;
if (model->columnType(index.column()) == COL_TYPE_COLOR) {
qColorButton_C * colorButton = static_cast<qColorButton_C *>(editor);
colorButton->setColor(_model->getColor(index));
QTimer::singleShot(5, colorButton, SLOT(showMenu()));
}
else QStyledItemDelegate::setEditorData(editor, index);
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.