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