1

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

我有带有多行段落的数据库,我想使用一些视图在 Qt 中显示。

我另外想要的是用户不必为了阅读而重新调整窗口大小,所以,如果进入大段落,那么大小会缩小,而小段落,字体会增加,从而占用总空间来显示.

请建议:

  • 什么逻辑或功能适合缩小和扩大尺寸,或者是否有一个小部件/视图已经这样做(通过修改属性)或关于如何实现它的建议。
  • 同样的问题,显示缩小/扩展的东西,但只使用树视图。那么我可以在树视图中执行此操作吗?如何?
4

1 回答 1

1

这是一种您可以使用自定义QItemDelegate. 请注意,此解决方案并不完整,您仍然需要在这里做一些工作。

首先,一些代码来设置 aQStandardItemModelQTreeView. 视图使用自定义委托,如下所述。

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

于 2013-04-12T18:34:23.773 回答