3

QT GUIを使用しています。QTableView を使用して単純な 16 進編集コントロールを実装しています。私の最初のアイデアは、17 列のテーブルを使用することです。テーブルの各行には 16 の 16 進バイトがあり、17 番目の列にそのデータの ASCII 表現があります。理想的には、17 番目の列のスタイルを編集/設定して、各セルの上下に線がないようにして、テキストに自由に流れるような外観を与えたいと考えています。QTableView を使用してこれにアプローチする最良の方法は何ですか?

4

1 に答える 1

4

必要なことを行うには、いくつかの方法を考えることができます。QTableView クラスのグリッド描画ルーチンに直接フックする方法がないように見えるため、両方ともカスタム グリッドの描画が含まれます。

1. setShowGrid(false) を呼び出してツリービュー グリッドの標準グリッドをオフにし、item デリゲートを使用してそれらを必要とするセルのグリッド線を描画します。以下に例を示します。

// custom item delegate to draw grid lines around cells
class CustomDelegate : public QStyledItemDelegate
{
public:
    CustomDelegate(QTableView* tableView);
protected:
    void paint(QPainter* painter, const QStyleOptionViewItem& option, const QModelIndex& index) const;
private:
    QPen _gridPen;
};

CustomDelegate::CustomDelegate(QTableView* tableView)
{
    // create grid pen
    int gridHint = tableView->style()->styleHint(QStyle::SH_Table_GridLineColor, new QStyleOptionViewItemV4());
    QColor gridColor = static_cast<QRgb>(gridHint);
    _gridPen = QPen(gridColor, 0, tableView->gridStyle());
}

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

    QPen oldPen = painter->pen();
    painter->setPen(_gridPen);

    // paint vertical lines
    painter->drawLine(option.rect.topRight(), option.rect.bottomRight());
    // paint horizontal lines 
    if (index.column()!=1) //<-- check if column need horizontal grid lines
        painter->drawLine(option.rect.bottomLeft(), option.rect.bottomRight());

    painter->setPen(oldPen);
}

// set up for your tree view:
ui->tableView->setShowGrid(false);
ui->tableView->setItemDelegate(new CustomDelegate(ui->tableView));

2. QTableView の子孫を作成し、paintEventメソッドをオーバーライドします。そこで、独自のグリッドを描画するか、基本クラスに描画させてから、テーブルビューの背景色を使用してグリッドの上に水平線をペイントできます。

これが役に立てば幸いです、よろしく

于 2010-04-27T01:59:46.183 に答える