自动填充以在Qt表中更正大小

时间:2013-04-06 14:46:23

标签: c++ qt

我正在尝试通过做一些项目来学习Qt,并希望快速指出我的要求的一部分。

我有多行通道的数据库,我希望在Qt中使用一些视图显示。

我还想要的是,用户不必为了阅读而重新调整窗口大小,因此,如果大通道进入,则大小缩小,并且将小通道,字体增加使得它需要总数要显示的空间。

请建议:

  • 适合缩小和扩展大小的逻辑或功能,或者是否已经这样做(通过修改属性)或建议如何实现它。
  • 同样的问题,显示收缩/扩展的东西,但仅使用树视图。那我可以在树视图中这样做吗?怎么样?

1 个答案:

答案 0 :(得分:1)

以下是一种使用自定义QItemDelegate执行此操作的方法。 请注意,此解决方案尚未完成,您仍需要在此处完成一些工作。

首先,设置QStandardItemModelQTreeView的代码。 View使用自定义Delegate,如下所述。

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);

    QStandardItemModel model(4, 4);
    for (int row = 0; row < 4; ++row) {
        for (int column = 0; column < 4; ++column) {
            QStandardItem *item = new QStandardItem(QString("row %0, column %1").arg(row).arg(column));
            model.setItem(row, column, item);
        }
    }

    Delegate delegate;

    QTreeView view;
    view.setItemDelegate(&delegate);
    view.setModel(&model);
    view.setWindowTitle("QTreeView with custom delegate");
    view.show();

    return a.exec();
}

以下是Delegate的代码。 它查看文本有多少可用空间,然后尝试查找适合的字体大小。 我目前只检查宽度并忽略高度。

class Delegate : public QItemDelegate
{
    void paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const;
};

void Delegate::paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const
{
    QRect availableSpace = option.rect;
    // padding taking place, don't know how to find out how many pixels are padded. 
    // for me, subtracting 6 looked ok, but that's not a good solution
    availableSpace.setWidth(availableSpace.width() - 6);
    QString text = index.data().toString();
    QStyleOptionViewItem newOption(option);

    // initial font size guess
    float size = 20;
    int width;
    // try to make font smaller until the text fits
    do
    {
        newOption.font.setPointSizeF(size);
        size -= .1;
        width = QFontMetrics(newOption.font).width(text);
    }
    while (width > availableSpace.width());

    newOption.textElideMode = Qt::ElideNone;

    // call the parent paint method with the new font size
    QItemDelegate::paint(painter, newOption, index);
}

结果如下:

QTreeView with custom delegate