【问题标题】:Make the delegate QtComboBox able to detect clicks使委托 Qt ComboBox 能够检测点击
【发布时间】:2014-05-04 04:17:42
【问题描述】:

我是 Qt 的新手。我有一个带有代表组合框的表格作为第二列。 我想检测对组合框的点击。

我想到了一种方法:将组合框作为私有变量添加到 ComboBoxDelegate 中,并添加一个公共槽作为

void on_cb_currentIndexChanged ( const QString & text );

但是,由于 createEditor 是 const 并且我无法在此方法中重新分配变量 cb。 有没有其他方法可以做到这一点?

class ComboBoxDelegate : public QItemDelegate
{
     Q_OBJECT

 public:
     ComboBoxDelegate(std::vector<std::string> values, QObject *parent = 0);
     ~ComboBoxDelegate();
     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;

   private:
    std::vector<std::string> values;
  }

【问题讨论】:

    标签: c++ qt qcombobox qitemdelegate


    【解决方案1】:

    正如您所说,您可以将组合框作为委托类的成员,并在 createEditor 中创建组合框时将组合框的 currentIndexChanged 信号连接到某个插槽。您应该将组合框声明为可变的,以便在恒定的 createEditor 中对其进行更新。如果一个数据成员被声明为可变的,那么从一个 const 成员函数给这个数据成员赋值是合法的:

    #include <QItemDelegate>
    
    #include <QComboBox>
    
    class ComboBoxDelegate: public QItemDelegate
    {
     Q_OBJECT
    public:
        ComboBoxDelegate(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;
    
        QStringList comboItems;
    
        mutable QComboBox *combo;
    
    private slots:
    
        void setData(int val);
    
    };
    
    ComboBoxDelegate::ComboBoxDelegate(QObject *parent ):QItemDelegate(parent)
    {
            comboItems<<"Item 1"<<"Item 2"<<"Item 3";
    }
    
    QWidget *ComboBoxDelegate::createEditor(QWidget *parent, const QStyleOptionViewItem &option, const QModelIndex &index) const
    {
        combo = new QComboBox( parent );
        QObject::connect(combo,SIGNAL(currentIndexChanged(int)),this,SLOT(setData(int)));
        combo->addItems(comboItems);
        combo->setMaxVisibleItems(comboItems.count());
        return combo;
    }
    
    void ComboBoxDelegate::setEditorData(QWidget *editor, const QModelIndex &index) const
    {
        QString text = index.model()->data( index, Qt::DisplayRole ).toString();
    
        int comboIndex = comboItems.indexOf(QRegExp(text));
    
        if(comboIndex>=0)
            (static_cast<QComboBox*>( editor ))->setCurrentIndex(comboIndex);
    }
    
    void ComboBoxDelegate::setModelData(QWidget *editor, QAbstractItemModel *model, const QModelIndex &index) const
    {
        model->setData( index, static_cast<QComboBox*>( editor )->currentText() );
    }
    
    
    void ComboBoxDelegate::updateEditorGeometry(QWidget *editor, const QStyleOptionViewItem &option, const QModelIndex &index) const
    {
        editor->setGeometry( option.rect );
    }
    
    void ComboBoxDelegate::setData(int val)
    {
        emit commitData(combo);
        //emit closeEditor(combo);
    }
    

    在这里,我将组合框的 currentIndexChanged 信号连接到 setData 插槽,该插槽将数据提交给模型。您还可以将该信号连接到您希望的任何插槽。

    【讨论】:

    • 谢谢!如果我添加一个类似 setData(QString val) 而不是 int val 的方法,为什么它不起作用?这可能是一个显而易见的答案,但我是 Qt 的新手。
    • 连接的信号和槽的参数要兼容。信号 currentIndexChanged(int) 具有 int 参数。所以 setData 应该有一个 int 参数,也可以没有参数。
    • QObject::connect(combo,SIGNAL(currentIndexChanged(QString)),this,SLOT(setData(QString)));应该工作吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-24
    相关资源
    最近更新 更多