5

アイテム名、アイテムの説明、および関連する 2 つのブール値をそれぞれの列に表示するツリー ビューが必要でした。編集可能なツリー モードの例を変更することから始めたので、TreeItem のグループを追跡する TreeModel があり、それぞれに子 TreeItem のリストだけでなく、後で使用できる一連の値を格納する QVariants のリストもあります。 QTreeView の列に表示されます。

2 つのブール値に対してさらに 2 つの列を追加することができました。また、QTreeView と QAbstractItemModel のチェックボックスを追加する方法についてネットを検索しました。2 つのブール列のチェックボックスと、ツリー階層の残りの部分が正常に機能するようになりました。それでも、各列のすべてのアイテムは、チェックボックスとテキスト行をレンダリングします。

チェックボックス付き Qt TreeView

主に TreeModel 内で、例から変更した部分を次に示します。

ツリーモデル.cpp:

bool TreeModel::isBooleanColumn( const QModelIndex &index ) const
{
    bool bRet = false;
    if ( !index.isValid() )
    {
    }
    else
    {
        bRet = ( index.column() == COLUMN_BOL1 ) || ( index.column() == COLUMN_ BOL2 );
    }
    return bRet;
}

Qt::ItemFlags TreeModel::flags(const QModelIndex &index) const
{
    if (!index.isValid())
        return 0;
    if ( isBooleanColumn( index ) )
    {
        return Qt::ItemIsEnabled | Qt::ItemIsUserCheckable;
    }
    else
    {
        return Qt::ItemIsEditable | Qt::ItemIsEnabled | Qt::ItemIsSelectable;
    }
}

QVariant TreeModel::data(const QModelIndex &index, int role) const
{
    if (!index.isValid())
        return QVariant();
    if (role != Qt::DisplayRole && role != Qt::EditRole && role != Qt::CheckStateRole )
        return QVariant();
    TreeItem *item = getItem(index);
    if ( role == Qt::CheckStateRole && isBooleanColumn( index ) )
    {
        Qt::CheckState eChkState = ( item->data( index.column() ).toBool() ) ? Qt::Checked : Qt::Unchecked;
        return eChkState;
    }
    return item->data(index.column());
}

bool TreeModel::setData(const QModelIndex &index, const QVariant &value,
                        int role)
{
    if (role != Qt::EditRole && role != Qt::CheckStateRole )
        return false;
    TreeItem *item = getItem(index);
    bool result;
    if ( role == Qt::CheckStateRole && isBooleanColumn( index ) )
    {
        Qt::CheckState eChecked = static_cast< Qt::CheckState >( value.toInt() );
        bool bNewValue = eChecked == Qt::Checked;
        result = item->setData( index.column(), bNewValue );
    }
    else
    {
        result = item->setData(index.column(), value);
    }
    if (result)
        emit dataChanged(index, index);
    return result;
}

メインウィンドウ.cpp:

MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
{
    …
    QStringList headers;
    headers << tr("Title") << tr("Description") << tr("Hide") << tr("Lock");
    QFile file(":/default.txt");
    file.open(QIODevice::ReadOnly);
    TreeModel *model = new TreeModel(headers, file.readAll());
    file.close();

    …
}

非ブール列の下のチェックボックスはユーザー入力に応答せず、ブール列の下のテキストは編集できません。機能的には問題ありませんが、UIに関してはまだ面倒です.

私は QTreeWidget に同じことをさせようとしています。その間、他に何か足りないものはないかと考えずにはいられませんでした。解決策の 1 つは、カスタム デリゲートを使用することだと聞きました。それが唯一の選択肢ですか?

私が他に何をする必要があるかを指摘したり、同様の例を提供したりできる人がいれば、私はそれを大いに感謝します.

4

2 に答える 2

1

問題は Data メソッドにあると思います。ロールが CheckStateRole であるが、列がブール値でない場合は、QVariant() を返す必要があります。

于 2014-03-19T18:58:20.163 に答える