0

にカスタム委任者を追加しましたQTableView。アイテムをダブルクリックすると、「QSpinBox」であるエディター ウィジェットが表示され、値をうまく編集できます。このエディター ウィジェットは、フォーカスが失われると消えます。私が欲しいのはQSpinBox、いつもそこにいることです。ここでQtの例を見ると、クラスのpaint関数をオーバーライドしQAbstractItemDelegateて描画する必要があるQSpinBoxことがわかりますが、その方法がわかりません。一般的に、ペイント関数内で Qt ウィジェットを描画する方法を知りたいです。
参考までに、私は次のテストコードを持っています:

#include <QtWidgets/QApplication>
#include <QtGui>
#include <QTableview>
#include <QLayout>
#include <QColor>
#include <QStyledItemDelegate>
#include <QSpinbox>

class SpinBoxDeligate : public QStyledItemDelegate {
public:
    QWidget * createEditor(QWidget *parent,
        const QStyleOptionViewItem &option,
        const QModelIndex &index) const override {
        auto w = new QSpinBox(parent);
        w->setFrame(false);
        w->setMinimum(0);
        w->setMaximum(100);
        return w;
    }

    void setEditorData(QWidget *editor, const QModelIndex &index) const override {
        static_cast<QSpinBox*>(editor)->setValue(index.data(Qt::EditRole).toInt());
    }

    void setModelData(QWidget *editor, QAbstractItemModel *model, const QModelIndex &index) const override {
        model->setData(index, static_cast<QSpinBox*>(editor)->value(), Qt::EditRole);
    }

    void paint(QPainter *painter, const QStyleOptionViewItem &option,
        const QModelIndex &index) const
    {
        // What to replace below line with to have a QSpinBox
        QStyledItemDelegate::paint(painter, option, index);
    }
};


int main(int argc, char** argv)
{
    QApplication app(argc, argv);

    QStandardItemModel model(3, 1);

    for (int r = 0; r < 3; ++r)
    {
        auto text = QString("%0").arg(r);
        QStandardItem* item = new QStandardItem(text);

        item->setFlags(Qt::ItemIsUserCheckable
            | Qt::ItemIsEnabled
            | Qt::ItemIsEditable
        );
        item->setData(Qt::Unchecked, Qt::CheckStateRole);
        item->setData(text, Qt::ToolTipRole);
        item->setData(QSize(100, 30), Qt::SizeHintRole);
        item->setData(QIcon(":/QtMVC/Desert.jpg"), Qt::DecorationRole);
        model.setItem(r, 0, item);
    }

    QTableView* table = new QTableView();
    table->setModel(&model);
    table->setItemDelegate(new SpinBoxDeligate());

    QWidget w;
    QVBoxLayout* containerLayout = new QVBoxLayout();
    w.setLayout(containerLayout);
    containerLayout->addWidget(table);
    w.show();

    return app.exec();
}
4

2 に答える 2

1

考えられる解決策は次の 2 つです。

  1. 表のセルにウィジェットを挿入することができます。これはあなたがやろうとしていることではないことはわかっていますが、問題のより良い解決策になる可能性があります. setIndexWidgetを確認してください。
  2. 本当に QSpinBox をレンダリングしたい場合は、QWidget のrenderメソッドを使用する必要があります。試すには、paintメソッドで を作成し、ポインターQSpinBoxを渡してその render メソッドを呼び出します。QPainterこのように動作するようになったらQSpinBox、QTableView で「テンプレート」インスタンスを保持することでデザインを改善し、それを使用してQSpinBox必要に応じてセル内に異なる値をレンダリングできます。
于 2018-08-08T11:04:49.397 に答える