C++ QStyledItemDelegate-创建编辑器后立即显示按钮菜单

C++ QStyledItemDelegate-创建编辑器后立即显示按钮菜单,c++,qt,C++,Qt,我有一个QTableView,它显示一个“Color”列,用户点击该列,一个带有菜单的按钮,应该创建一个颜色选择器小部件。我对在表格单元格中创建和显示此按钮没有问题。但我担心的是,要访问颜色选择器小部件并选择合适的颜色,用户必须进行3次单击 第一次单击-单元格变为可编辑,并显示按钮 第二个单击按钮显示带有颜色选择器小部件的菜单 第三次单击-用户从颜色选择器中选择所需的颜色 小部件 我想把点击次数减少到两次,这样用户就可以实现上述所有功能。就是 第一次单击-单元格将变为可编辑,并在 同时,带有颜色

我有一个QTableView,它显示一个“Color”列,用户点击该列,一个带有菜单的按钮,应该创建一个颜色选择器小部件。我对在表格单元格中创建和显示此按钮没有问题。但我担心的是,要访问颜色选择器小部件并选择合适的颜色,用户必须进行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);
    }
    
    void qDrawToolsDelegate_C::setEditorData(QWidget*编辑器,常量QModelIndex&index)常量
    {
    如果(!index.isValid()| |!editor)返回;
    const qDrawToolsModel_C*model=static_cast(index.model());
    如果(!model)返回;
    if(model->columnType(index.column())==COL\u TYPE\u COLOR){
    qColorButton_C*colorButton=静态(编辑器);
    colorButton->setColor(_model->getColor(index));
    颜色按钮->显示菜单();
    }
    else QStyledItemDelegate::setEditorData(编辑器,索引);
    }
    
    菜单显示,但按钮似乎没有正确显示。我假设菜单在绘制按钮完成之前弹出。参见图1(点击红细胞)

    当弹出窗口关闭时,按钮正确绘制。见图2

    我不确定弹出窗口如何阻止按钮上的绘画。如果真的是因为这个原因,我可以考虑创建一个计时器,然后在计时器插槽中调用showMenu()来解决这个问题。但我喜欢你们关于如何更好地实现这一目标的建议


    PS:我只是RTFM:)。它说的是showMenu()-“在用户关闭弹出菜单之前,此函数不会返回。”

    我的印象是,当调用qstyledItemDeleteGate::setEditorData()时,它已经完全显示,我认为情况并非如此。解决方案是在setEditorData()中添加一个单发计时器来调用showMenu()

    void qDrawToolsDelegate_C::setEditorData(QWidget*编辑器,常量QModelIndex&index)常量
    {
    如果(!index.isValid()| |!editor)返回;
    const qDrawToolsModel_C*model=static_cast(index.model());
    如果(!model)返回;
    if(model->columnType(index.column())==COL\u TYPE\u COLOR){
    qColorButton_C*colorButton=静态(编辑器);
    colorButton->setColor(_model->getColor(index));
    QTimer::单镜头(5,彩色按钮,插槽(showMenu());
    }
    else QStyledItemDelegate::setEditorData(编辑器,索引);
    }
    
    正如我所提到的,showMenu()调用会阻塞并停止绘制单元格。因此,我可以通过将单点定时器连接到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);
    }