• 21983阅读
  • 19回复

如何让QTableWidget的列表头自动适应宽度? [复制链接]

上一主题 下一主题
离线tancu
 
只看楼主 倒序阅读 楼主  发表于: 2008-12-17
— 本帖被 XChinux 执行加亮操作(2009-01-06) —

请看上面的的列表头,使用了QTableWidget,如何让右边的空列消失,并且当我调整列的宽度时(包括运行时删除一列),列表头照样能适应宽度的改变并且不会出空列?对这个问题我查了很多资料,但都搞不定,请大家帮帮忙,谢谢!
一人业余菜鸟对编程坚持了十几年...
离线nmiirq

只看该作者 1楼 发表于: 2008-12-17
#include <QtGui>
#include <QApplication>
#include <QDebug>

class MyHeaderView:public QHeaderView
{
    public:
        MyHeaderView(Qt::Orientation orientation, QWidget* parent=0):QHeaderView(orientation, parent)
        {
            setStretchLastSection ( true);
        }
    protected:
        void paintSection ( QPainter * painter, const QRect & rect, int logicalIndex ) const
        {
            painter->save();
            QHeaderView::paintSection(painter, rect, logicalIndex);
            painter->restore();
            painter->setPen(QColor(Qt::green));
            painter->drawEllipse(rect);
        }
        QSize sizeHint () const
        {
            return QSize(200,100);
        }
};

int main (int argc, char **argv)
{
  QApplication app (argc, argv);
  MyHeaderView* header=new MyHeaderView(Qt::Horizontal);
  QTreeView view;
  QDirModel model;
  view.setModel(&model);
  view.setHeader(header);

  view.show();
  return app.exec ();
}
离线nmiirq

只看该作者 2楼 发表于: 2008-12-17
试下,这个是从别人给的示例改的,当然用的不是QTableWidget,但应该也是适用的,你先试试吧!
离线tancu
只看该作者 3楼 发表于: 2008-12-17
试了,这个例子的表头能自动适应,可是这个例子是不是专门设计了一个表头?而QTableWidget已经有表头了,我想是不是有一个属性可以设置,或者说,是不是要专门写一个函数。我是在QT设计师里面做的。。。。
一人业余菜鸟对编程坚持了十几年...
离线lazybone
只看该作者 4楼 发表于: 2008-12-17
我是自己控制的 还有其他方法么
离线tancu
只看该作者 5楼 发表于: 2008-12-17
请问楼上的朋友,能否把控制代码共享一起?多谢!
一人业余菜鸟对编程坚持了十几年...
离线tancu
只看该作者 6楼 发表于: 2008-12-17
能否像这样子来控制(部分代码不知怎写):
int tableWidth = 表格的总宽度;
int count = tableWidget.columnCount();
for(int i =0; i <= count; i++)
    setColumnWidth(i,tableWidth/count);
一人业余菜鸟对编程坚持了十几年...
离线lazybone
只看该作者 7楼 发表于: 2008-12-17
我的表格简单只有几列
前面的比较固定列使用resizeColumnToContents(idx)
最后的[备注]列独享剩下的空间=tableWidth -前面的总列宽
离线tancu
只看该作者 8楼 发表于: 2008-12-17
经过一个中午思考,最后找到解决方法。因为QTableWidget继承有QHeaderView,而QHeaderView有一个方法setStretchLastSection(),它的形参为bool 型,可以用来设置是否充满宽度。
下面是一个例子:
#include <QtGui/QApplication>
#include <QtGui/QTableWidget>
#include <QtGui/QHeaderView>

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

    QTableWidget *table = new QTableWidget();
    table->setColumnCount(3);
    table->setRowCount(5);
    table->horizontalHeader()->setStretchLastSection(true);  //就是这个地方
    table->show();
    return app.exec();

}

感谢nmiirq 给予的提示和帮助!感谢lazybone 的关注!
一人业余菜鸟对编程坚持了十几年...
离线nmiirq

只看该作者 9楼 发表于: 2008-12-17
楼主还是蛮聪明的!
离线tancu
只看该作者 10楼 发表于: 2008-12-17
过奖了,我也只是一个菜鸟,还有很多东西要向大家学习!
一人业余菜鸟对编程坚持了十几年...
离线duduqq

只看该作者 11楼 发表于: 2008-12-17
这个问题我以前也遇到,搞了我N天,后来才找到那个函数。
刚看到这贴,不过你都做出来了,不错。
离线jotiny

只看该作者 12楼 发表于: 2009-06-16
ui->tableWidget->horizontalHeader()->setResizeMode(QHeaderView::Stretch);

这样就可以了
离线y383564500
只看该作者 13楼 发表于: 2009-08-22
哈哈,学习了
离线bahuasheng
只看该作者 14楼 发表于: 2009-11-01
赞12楼的 那个是能够做到平均分 而楼主找到的函数虽然能完成填充 但是用的最后一列填充的 就会导致列大小不一致
不过楼主比我厉害多了 我都没找到
离线foxyz

只看该作者 15楼 发表于: 2009-11-02
我一般用:
ui->tableWidget->horizontalHeader()->setResizeMode(QHeaderView::ResizeToContents);

这样,列宽度会按照列内容中最长的来resize
离线九重水

只看该作者 16楼 发表于: 2009-11-11
楼主的方法在嵌入式linux和linux上好像不行呀
离线numon

只看该作者 17楼 发表于: 2009-11-19
学习了。群众的力量是无穷的。
离线halida

只看该作者 18楼 发表于: 2009-12-16
同志们,我用英文找,找到了最好的解法了!
用 resizeColumnsToContents
离线clickto

只看该作者 19楼 发表于: 2017-10-24
mark一下
快速回复
限100 字节
 
上一个 下一个