2

QTreeWidget を含むクラス (EditorTagManager) があります。実行時に、ツリーには任意の数のタグ項目を含めることができ、そのすべてがチェック可能です。これらのタグが無関係であり、互いに分離することを意図していることを明確にするために、QTreeWidgetItems の間に水平線を追加しようとしています (各項目はルートレベルのノードです)。

このテーマに関する調査から、QtreeWidgetItems の外観を意味のある範囲で制御する唯一の方法は、QStyledItemDelegate をサブクラス化し、デリゲートを QTreeWidget にバインドすることであることがわかりました。抽象的な概念なので、よくわかりません。これまで Qt オブジェクトをサブクラス化する必要がなかったので、正しく実行できているかどうかわかりません。

Qt のドキュメントではこれを行う方法が実際には説明されていないため、Clementine の設定ウィンドウは QTreeWidget で同様のセパレーターを使用するため、Clementine 1.0.1 ソース コードの settingsdialog.cpp/.h ファイルをガイド/リファレンスとして使用しました。私はクレメンタインのコードから自分のソリューションをリバースエンジニアリングしようとしています.唯一の問題は、クレメンタインの実装が私が必要としないことを行うことです. それが、私がこの時点に到達した理由です。私のコードは Clementine のコードと非常によく似ています (デリゲート クラス名を変更しただけです)。

これが、editortreemanager.h の現在のデリゲート ヘッダー宣言です。

class TagListDelegate : public QWidget
{

public:
    TagListDelegate(QObject* parent);
    void paint(QPainter* painter, const QStyleOptionViewItem& option,
                const QModelIndex& index) const;
};

これが、editortreemanager.cpp の現在のデリゲート ソースです。

TagListDelegate::TagListDelegate(QObject *parent) :
    TagListDelegate(parent){

}

void TagListDelegate::paint(QPainter *painter, const QStyleOptionViewItem &option,
                            const QModelIndex &index) const{

}

TagListDelegate::paint() は実際にはまだ何も実行していませんが、QTreeWidgetItems の外観を変更する前に、このコードを正しく動作させたいだけです。私の目標は、今のところこれをできるだけシンプルに保つことです。

QTreeWidget (ui->AvailableTags) にデリゲートを使用するように指示するまで、すべてが正常にコンパイルされました。

ui->AvailableTags->setItemDelegate(new TagListDelegate(this)); 

コンパイラエラーは次のとおりです。

/home/will/qt_projects/robojournal/ui/editortagmanager.cpp:211: エラー: 'QTreeWidget::setItemDelegate(TagListDelegate*)' の呼び出しに一致する関数がありません

私はここで少し頭を抱えているので、これを理解するのに助けていただければ幸いです。

更新 (2013 年 7 月 30 日):

私の Delegate クラスは次のようになります。

ソース:

TagListDelegate::TagListDelegate(QStyledItemDelegate *parent) :
    TagListDelegate(parent){

}

void TagListDelegate::paint(QPainter *painter, const QStyleOptionViewItem &option,
                            const QModelIndex &index) const{

    QStyledItemDelegate::paint(painter, option, index);

}

ヘッダー宣言:

class TagListDelegate : public QStyledItemDelegate
{

public:
    TagListDelegate(QStyledItemDelegate* parent);
    void paint(QPainter* painter, const QStyleOptionViewItem& option,
                const QModelIndex& index) const;
};

更新 (2013 年 7 月 31 日)

これが私のクラスの外観です。

ヘッダ:

class TagListDelegate : public QStyledItemDelegate
{

public:
    TagListDelegate(QObject* parent);
    QSize sizeHint(const QStyleOptionViewItem& option, const QModelIndex& index) const;
    void paint(QPainter* painter, const QStyleOptionViewItem& option,
                const QModelIndex& index) const;
};

ソース:

TagListDelegate::TagListDelegate(QObject *parent)
    : TagListDelegate(parent){

}

QSize TagListDelegate::sizeHint(const QStyleOptionViewItem &option, const QModelIndex &index) const
{
     QSize ret = QStyledItemDelegate::sizeHint(option, index);
     return ret;
}


void TagListDelegate::paint(QPainter *painter, const QStyleOptionViewItem &option,
                            const QModelIndex &index) const{

    QStyledItemDelegate::paint(painter, option, index);

}
4

1 に答える 1