【发布时间】:2020-05-18 07:56:58
【问题描述】:
我有一个 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() -“在用户关闭弹出菜单之前,此函数不会返回。”
【问题讨论】:
-
正如我所提到的,showMenu() 调用会阻塞并停止在中途绘制单元格。所以我可以通过将单次计时器连接到 showMenu() 插槽来解决这个问题。如果你有更好的想法,请分享。谢谢。