簡體   English   中英

QStyledItemDelegate - 創建編輯器后立即顯示按鈕菜單

[英]QStyledItemDelegate - show button menu as soon as the editor is created

我有一個 QTableView,它顯示一個“顏色”列,用戶單擊該列,應創建一個帶有菜單的按鈕,該按鈕具有一個顏色選擇器小部件。 我在表格單元格上創建和顯示此按鈕沒有問題。 但我擔心的是,要進入顏色選擇器小部件並選擇正確的顏色,用戶必須點擊 3 次。

  1. 第一次單擊 - 單元格變為可編輯並出現按鈕
  2. 第二次單擊 - 按鈕顯示帶有顏色選擇器小部件的菜單。
  3. 第三次單擊 - 用戶從顏色選擇器小部件中選擇所需的顏色

我想將其減少到兩次點擊,以便用戶應該能夠實現上述所有目標。 那是,

  1. 第一次單擊 - 單元格變為可編輯並出現按鈕,同時也顯示帶有顏色選擇器的菜單
  2. 第二次單擊 - 用戶從選擇器中選擇所需的顏色

我試圖在 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM