【问题标题】:QStyledItemDelegate - show button menu as soon as the editor is createdQStyledItemDelegate - 创建编辑器后立即显示按钮菜单
【发布时间】:2020-05-18 07:56:58
【问题描述】:

我有一个 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() -“在用户关闭弹出菜单之前,此函数不会返回。”

【问题讨论】:

  • 正如我所提到的,showMenu() 调用会阻塞并停止在中途绘制单元格。所以我可以通过将单次计时器连接到 showMenu() 插槽来解决这个问题。如果你有更好的想法,请分享。谢谢。

标签: c++ qt


【解决方案1】:

我的印象是,当调用 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);
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-24
    • 1970-01-01
    • 2011-06-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多