我正在尝试通过做一些项目来学习Qt,并希望快速指出我的要求的一部分。
我有多行通道的数据库,我希望在Qt中使用一些视图显示。
我还想要的是,用户不必为了阅读而重新调整窗口大小,因此,如果大通道进入,则大小缩小,并且将小通道,字体增加使得它需要总数要显示的空间。
请建议:
答案 0 :(得分:1)
以下是一种使用自定义QItemDelegate
执行此操作的方法。
请注意,此解决方案尚未完成,您仍需要在此处完成一些工作。
首先,设置QStandardItemModel
和QTreeView
的代码。
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);
}
结果如下: