我正在尝试通过做一些项目来学习 Qt,并希望快速了解我的需求的一部分。
我有带有多行段落的数据库,我想使用一些视图在 Qt 中显示。
我另外想要的是用户不必为了阅读而重新调整窗口大小,所以,如果进入大段落,那么大小会缩小,而小段落,字体会增加,从而占用总空间来显示.
请建议:
- 什么逻辑或功能适合缩小和扩大尺寸,或者是否有一个小部件/视图已经这样做(通过修改属性)或关于如何实现它的建议。
- 同样的问题,显示缩小/扩展的东西,但只使用树视图。那么我可以在树视图中执行此操作吗?如何?
这是一种您可以使用自定义QItemDelegate
. 请注意,此解决方案并不完整,您仍然需要在这里做一些工作。
首先,一些代码来设置 aQStandardItemModel
和QTreeView
. 视图使用自定义委托,如下所述。
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);
}
结果如下所示: