QTableView自动调整行高

Automatically adjust rows height in QTableView

我有一个派生自 QTableView (Qt 5.5.1) 的小部件,用于呈现来自 Postgres 服务器的数据。我想在用户使用鼠标调整列大小时自动调整行高以换行内容:

MyTableView::MyTableView(QWidget *parent) : QTableView(parent)
{
    //  ...
    connect(
        horizontalHeader(),
        SIGNAL(sectionResized(int, int, int)),
        this,
        SLOT(resizeRowsToContents()));
}

这对小的 table 非常有效,但是大的 table 实际上不适合 table 使用,因为速度很慢。我需要一个像 afterSectionResized 这样的信号(当鼠标释放完成调整大小时)但是没有这样的事件。

当用户使用鼠标调整列大小时,如何避免多次 table 格式化?

定义一个新的class(MyHeaderView)派生自QHeaderView和一个新的信号(resized()) 当用户在调整部分大小时释放鼠标按钮时发出。

myheaderview.h

class MyHeaderView : public QHeaderView
{
    Q_OBJECT

public:
    explicit MyHeaderView(QWidget *parent = 0);

signals:
    void resized();

private:
    bool resizing;
    void mouseReleaseEvent(QMouseEvent *);

private slots:
    void setResizing();
};

myheaderview.cpp

MyHeaderView::MyHeaderView(QWidget *parent)
    : QHeaderView(Qt::Horizontal, parent)
{
    resizing = false;
    connect(this,
            SIGNAL(sectionResized(int, int, int)),
            this,
            SLOT(setResizing()));
}

void MyHeaderView::setResizing()
{
    resizing = true;
}

void MyHeaderView::mouseReleaseEvent(QMouseEvent *)
{
    if (resizing) {
        resizing = false;
        emit resized();
    }
}

MyTableView class 中用定义的 header 小部件替换标准水平 header:

MyTableView::MyTableView(QWidget *parent) : QTableView(parent)
{
    myHeaderView = new MyHeaderView(this);
    setHorizontalHeader(myHeaderView);
    connect(horizontalHeader(),
            SIGNAL(resized()),
            this,
            SLOT(resizeRowsToContents()));
}