首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >设置QtreeWidget高度

设置QtreeWidget高度
EN

Stack Overflow用户
提问于 2015-02-13 05:24:17
回答 1查看 3.4K关注 0票数 0

我对qt还不熟悉,所以我对小部件的大小策略和一些小部件不太了解。我有一个垂直的盒子布局,在这个布局中,我首先添加了一个Qlabel,然后添加了一个QTreeWidget,然后又添加了一个Qlabel。现在的问题是,QTreeWidget在垂直方向上占用全部空间,然后在QTreeWidget之后留下一个很大的空间,尽管目前只存在行,但是添加了QLabel。我希望第二个Qlabel在可见的两行之后立即添加,现在当添加更多的行时,它向下移动。有人能建议我怎么做吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-02-13 20:43:02

我认为这就是您的意思: UI在布局中有: Label、QTreeWidget、Label、Spacer (Spacer是很重要的,因为Qt可能只是展开标签来填充窗口)。重要事项:在设计师TreeWidget高到预置,垂直滚动条关闭。

UI示例:

代码语言:javascript
运行
复制
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
 <class>MainWindow</class>
 <widget class="QMainWindow" name="MainWindow">
  <property name="geometry">
   <rect>
    <x>0</x>
    <y>0</y>
    <width>517</width>
    <height>568</height>
   </rect>
  </property>
  <property name="windowTitle">
   <string>MainWindow</string>
  </property>
  <widget class="QWidget" name="centralWidget">
   <layout class="QVBoxLayout" name="verticalLayout">
    <item>
     <widget class="QLabel" name="label">
      <property name="text">
       <string>TextLabel</string>
      </property>
     </widget>
    </item>
    <item>
     <widget class="my_tree" name="treeView">
      <property name="sizePolicy">
       <sizepolicy hsizetype="Expanding" vsizetype="Preferred">
        <horstretch>0</horstretch>
        <verstretch>0</verstretch>
       </sizepolicy>
      </property>
      <property name="verticalScrollBarPolicy">
       <enum>Qt::ScrollBarAlwaysOff</enum>
      </property>
      <property name="horizontalScrollBarPolicy">
       <enum>Qt::ScrollBarAsNeeded</enum>
      </property>
     </widget>
    </item>
    <item>
     <widget class="QLabel" name="label_2">
      <property name="text">
       <string>TextLabel</string>
      </property>
     </widget>
    </item>
    <item>
     <spacer name="verticalSpacer">
      <property name="orientation">
       <enum>Qt::Vertical</enum>
      </property>
      <property name="sizeHint" stdset="0">
       <size>
        <width>20</width>
        <height>40</height>
       </size>
      </property>
     </spacer>
    </item>
   </layout>
  </widget>
  <widget class="QMenuBar" name="menuBar">
   <property name="geometry">
    <rect>
     <x>0</x>
     <y>0</y>
     <width>517</width>
     <height>21</height>
    </rect>
   </property>
  </widget>
  <widget class="QToolBar" name="mainToolBar">
   <attribute name="toolBarArea">
    <enum>TopToolBarArea</enum>
   </attribute>
   <attribute name="toolBarBreak">
    <bool>false</bool>
   </attribute>
  </widget>
  <widget class="QStatusBar" name="statusBar"/>
 </widget>
 <layoutdefault spacing="6" margin="11"/>
 <customwidgets>
  <customwidget>
   <class>my_tree</class>
   <extends>QTreeView</extends>
   <header>my_tree.h</header>
  </customwidget>
 </customwidgets>
 <resources/>
 <connections/>
</ui>

重载的QTreeView (在您的例子中是QTreeWidget)用于获取所需的大小提示:编辑--这是我称为“my_tree.h”的一个只懂标题的定义--

代码语言:javascript
运行
复制
    #ifndef MY_TREE_H
#define MY_TREE_H
#include <QHeaderView>
#include <QTreeView>

class my_tree: public QTreeView
{
    Q_OBJECT
public:
    my_tree(QWidget* parent):QTreeView(parent)
    {
        // Important: if something is shown/hidden we need a new size
        connect(this,SIGNAL(expanded( const QModelIndex & )),SLOT(onExpandCollapsed()));
        connect(this,SIGNAL(collapsed( const QModelIndex & )),SLOT(onExpandCollapsed()));
    };

    // QWidget interface
public:
    QSize sizeHint() const {return my_size(); };
    QSize minimumSizeHint() const { return my_size(); };

private:
    QSize my_size() const
    {   //QSize tst(sizeHintForColumn(0) + 2 * frameWidth(), sizeHintForRow(0) + 2 * frameWidth());

        int neededHight= 2 * frameWidth()+ this->header()->height();

        QModelIndex root = this->rootIndex();

        QAbstractItemModel* m = this->model();

        //if(this->rootIsDecorated())
        {
            neededHight += recursiveHeightHint(root,m);
        }
        QSize temp = QTreeView::sizeHint();
        temp.setHeight(neededHight);
        return QSize(1,neededHight);
    }

    // we need the size of all visible items -> isExpanded
    // the root item is usually shown as a non-Valid index -> !i.isValid()
    int recursiveHeightHint(QModelIndex i,QAbstractItemModel* m) const
    {
        int temp=sizeHintForIndex(i).height();
        if(this->isExpanded(i) || !i.isValid())
        {
        if(m->hasChildren(i))
        {
            int numRows = m->rowCount(i);
            for(int count =0;count<numRows;count++)
                temp+=recursiveHeightHint(m->index(count,0,i),m);
        }
        }
        return temp;
    }

private slots:
    void onExpandCollapsed(){updateGeometry();}
};

#endif // MY_TREE_H

PS:在Designer中,首先放置基本Widget,然后将其定义为自设计Widget的占位符。

我用这个条目获得了这个解决方案:

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28493041

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档