在QTableView中自动调整行高

时间:2015-11-24 11:31:39

标签: c++ postgresql qt qtableview

我有一个从QTableView(Qt 5.5.1)派生的小部件,用于显示Postgres服务器的数据。当用户使用鼠标调整列的大小时,我想自动将行高调整为自动换行的内容:

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

这适用于小桌子,但是由于大的减速,更大的桌子实际上不适合使用。我需要一个像afterSectionResized这样的信号(当用鼠标释放完成调整大小时)但是没有这样的事件。

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

1 个答案:

答案 0 :(得分:2)

定义从QHeaderView派生的新类(MyHeaderView)和新信号(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类中,使用已定义的标题窗口小部件替换标准水平标头:

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