【问题标题】:QComboBox doesn't show its item listQComboBox 不显示其项目列表
【发布时间】:2013-01-09 23:00:47
【问题描述】:

我对 QComboBox 作为 QTableWidget 的项目委托编辑器有疑问。 QTableWidget 使用 SqlTypeDelegate 作为项目委托。

当我在 QGraphicsScene(通过 QGraphicsProxyWidget)内绘制 QTableWidget 时,不会显示可用项目的 QComboBox 弹出列表。 但是,如果我将 QTableWidget 用作普通小部件(不是通过 QGraphicsScene\View 绘制),那么 QComboBox 的行为是正常的 - 它显示项目列表。

我应该怎么做才能强制 QComboBox 显示其项目列表?

下面的示例代码:

main.cpp:

#include <QtGui/QApplication>
#include <QGraphicsScene>
#include <QGraphicsView>
#include <QTableWidget>
#include "sqltypedelegate.h"

int main(int argc, char *argv[])
{
    QApplication app(argc, argv);
    QGraphicsScene scene;
    QTableWidget *table = new QTableWidget(4,2);
    table->setItemDelegate(new SqlTypeDelegate(table));
    QGraphicsProxyWidget *proxy = scene.addWidget(table);
    QGraphicsView view(&scene);
    view.show();
    return app.exec();
}

sqltypedelegate.h:

#include <QItemDelegate>
#include <QStyledItemDelegate>
#include <QModelIndex>
#include <QObject>
#include <QSize>
#include <QComboBox>

class SqlTypeDelegate : public QItemDelegate
{
    Q_OBJECT
public:
    SqlTypeDelegate(QObject *parent = 0);
    QWidget *createEditor(QWidget *parent, const QStyleOptionViewItem &option,
                          const QModelIndex &index) const;
    void setEditorData(QWidget *editor, const QModelIndex &index) const;
    void setModelData(QWidget *editor, QAbstractItemModel *model,
                      const QModelIndex &index) const;
    void updateEditorGeometry(QWidget *editor,
        const QStyleOptionViewItem &option, const QModelIndex &index) const;
};

sqltypedelegate.cpp:

#include <QtGui>
#include "sqltypedelegate.h"

SqlTypeDelegate::SqlTypeDelegate(QObject *parent)
    : QItemDelegate(parent)
{}

QWidget *SqlTypeDelegate::createEditor(QWidget *parent,
    const QStyleOptionViewItem &/* option */,
    const QModelIndex &/* index */) const
{
    QComboBox *editor = new QComboBox(parent);
    editor->addItem(QString("decimal(50)"));
    editor->addItem(QString("integer"));
    editor->addItem(QString("varchar(50)"));
    editor->addItem(QString("char"));

    editor->setEditable(true);
    return editor;
}

void SqlTypeDelegate::setEditorData(QWidget *editor,
                                    const QModelIndex &index) const
{
    QString value = index.model()->data(index, Qt::EditRole).toString();
    QComboBox *comboBox = static_cast<QComboBox*>(editor);
    comboBox->setEditText(value);
}

void SqlTypeDelegate::setModelData(QWidget *editor, QAbstractItemModel *model,
                                   const QModelIndex &index) const
{
    QComboBox *comboBox = static_cast<QComboBox*>(editor);
    model->setData(index, comboBox->currentText(), Qt::EditRole);
}

void SqlTypeDelegate::updateEditorGeometry(QWidget *editor,
    const QStyleOptionViewItem &option, const QModelIndex &/* index */) const
{
    QComboBox *comboBox = static_cast<QComboBox*>(editor);
    comboBox->setGeometry(option.rect);
}

【问题讨论】:

    标签: c++ qt qtablewidget qgraphicsscene qcombobox


    【解决方案1】:

    我终于找到了解决方案:事件过滤器! 潜伏于 QEvent::MouseButtonRelease 然后调用 showPopup。

    bool SqlTypeDelegate::eventFilter(QObject *object, QEvent *event)
    {
        QComboBox * comboBox = dynamic_cast<QComboBox*>(object);
        if (comboBox)
        {
            if (event->type() == QEvent::MouseButtonRelease)
            {
                comboBox->showPopup();
                return true;
            }
        }
        else
        {
            return QItemDelegate::eventFilter( object, event );
        }
        return false;
    }
    

    【讨论】:

    • 你确定这有效吗?在 Python (PyQt4) 中,我从来没有得到 QEvent::MOuseButtonRelease,所以所有的 comboBox 事件都被过滤了。我认为是comboBox 中的QtCore.QEvent.FocusOut 导致了这个问题。
    【解决方案2】:

    我遇到了同样的问题,我的解决方法是在 createEditor(...) 中添加两行代码。

    editor->move(option.rect.x(),option.rect.y());
    editor->showPopup();
    

    然后双击表格项时,QComboBox会显示第二次鼠标按键触发的弹出项,隐藏鼠标第二次释放触发的弹出项。这适用于 Qt 4.8。

    我还尝试了 Qt5.0,无论是否使用此解决方法,应用程序都崩溃了。 我已将此问题报告为错误。

    【讨论】:

    • 我找到了解决办法,看看我的回答。
    猜你喜欢
    • 2020-03-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-15
    相关资源
    最近更新 更多