您可以将QWidget设置为占用QTreeWidget的整个列吗?

您可以将QWidget设置为占用QTreeWidget的整个列吗?,qt,qt5,qtreewidget,Qt,Qt5,Qtreewidget,我有一个自定义的QTreeWidget子类,用于在MIDI编辑器项目()中显示曲目名称等。我想在这个树小部件中添加另一个列,但是一个小部件占据整个列,而不是每项小部件 这是可能的还是我必须想出其他的解决办法 编辑:我正在尝试这样做:-查看标题视图中的最后一个“列”(在“L/R余额”之后的第三个),显示所有行/注释(这完全是自定义的,并且是用VB.NET编写的,并且是封闭源代码) 编辑2:您看不到它,但在上图中,最后一列滚动,其他列不滚动。在他们的方法中,您必须使用鼠标滚动。我想要一个滚动条。查看

我有一个自定义的
QTreeWidget
子类,用于在MIDI编辑器项目()中显示曲目名称等。我想在这个树小部件中添加另一个列,但是一个小部件占据整个列,而不是每项小部件

这是可能的还是我必须想出其他的解决办法

编辑:我正在尝试这样做:-查看标题视图中的最后一个“列”(在“L/R余额”之后的第三个),显示所有行/注释(这完全是自定义的,并且是用VB.NET编写的,并且是封闭源代码)


编辑2:您看不到它,但在上图中,最后一列滚动,其他列不滚动。在他们的方法中,您必须使用鼠标滚动。我想要一个滚动条。

查看Qt文档,似乎有几个选项可以实现这一点,但是在您决定什么方法最适合您的需要之前,有几个重要因素需要解决

  • 此自定义树列中显示的内容是静态的还是动态的
  • 是否存在从QTreeWidget到自定义树列的行的一对一映射
  • 如果自定义树列内容是静态的,并且存在行的一对一映射,那么使用该函数就足够了

    但是,如果自定义树列的内容是动态的,或者没有行的一对一映射,则需要更复杂的方法

    如QTreeWidget文档所述;如果要显示自定义动态内容或实现自定义编辑器小部件,请使用QTreeView和子类QItemDelegate

    QItemDelegate及其子类为插入到Qt项目视图(如QTreeView、QListView、QTableView等)中的项目执行所有绘图功能。这本质上允许您控制插入到QTreeView类中的任何项目的所有绘图操作,除了能够跨多行扩展内容外,还允许您绘制动态内容


    在为QListWidget实现了类似的方法之后,我建议使用代替,因为它允许您更轻松地将此小部件与应用程序的样式布局集成。由于您没有详细说明此定制QWidget的确切用法,因此您可能还需要和提供的其他功能。如果可以的话,我会发布我在这里开发的类似小部件,但遗憾的是,它是专有软件套件的一部分

    这并不完全漂亮,因为当自定义小部件位于最右边的列中并且列变窄时,它遇到了问题,但这是一个开始:

    #include <QtGui>
    
    class TreeWidget : public QTreeWidget
    {
        Q_OBJECT
    public:
        TreeWidget();
    
        QRect columnRect(int column) const;
    
    private slots:
        void repositionColumnWidget();
    
    private:
        QPushButton * mColumnWidget;
    };
    
    TreeWidget::TreeWidget()
        : mColumnWidget(new QPushButton("Custom Column Button", viewport()))
    {
        const int COLUMN_COUNT = 6;
        setColumnCount(COLUMN_COUNT);
        for (int row = 0; row < 400; ++row)
        {
            QStringList columns;
            for (int column = 0; column < COLUMN_COUNT; ++column)
            {
                columns << QString("row %1, column %2").arg(row + 1).arg(column + 1);
            }
            addTopLevelItem(new QTreeWidgetItem(columns));
        }
        for (int column = 0; column < COLUMN_COUNT; ++column)
        {
            resizeColumnToContents(column);
        }
        repositionColumnWidget();
        mColumnWidget->show();
        connect(header(), SIGNAL(sectionResized(int,int,int)), this, SLOT(repositionColumnWidget()));
        connect(header(), SIGNAL(sectionMoved(int,int,int)), this, SLOT(repositionColumnWidget()));
        connect(verticalScrollBar(), SIGNAL(valueChanged(int)), this, SLOT(repositionColumnWidget()));
        connect(horizontalScrollBar(), SIGNAL(valueChanged(int)), this, SLOT(repositionColumnWidget()));
    }
    
    QRect TreeWidget::columnRect(int column) const
    {
        int itemCount = topLevelItemCount();
        if (!itemCount)
        {
            return QRect();
        }
        int columnX = header()->sectionViewportPosition(column);
        int columnY = visualItemRect(topLevelItem(0)).top();
        int columnWidth = header()->sectionSize(column);
        int columnHeight = visualItemRect(topLevelItem(itemCount-1)).bottom() - columnY + 1;
    
        return QRect(columnX, columnY, columnWidth, columnHeight);
    }
    
    void TreeWidget::repositionColumnWidget()
    {
        mColumnWidget->setGeometry(columnRect(3));
    }
    
    int main(int argc, char *argv[])
    {
        QApplication a(argc, argv);
        a.setQuitOnLastWindowClosed(true);
    
        TreeWidget treeWidget;
    
        treeWidget.resize(800, 600);
        treeWidget.show();
    
        return a.exec();
    }
    
    #include "main.moc"
    
    #包括
    类TreeWidget:公共QTreeWidget
    {
    Q_对象
    公众:
    树梢();
    QRect columnRect(int column)const;
    专用插槽:
    void-columnwidget();
    私人:
    QPushButton*McColumnWidget;
    };
    TreeWidget::TreeWidget()
    :mColumnWidget(新的QPushButton(“自定义列按钮”,viewport()))
    {
    const int COLUMN_COUNT=6;
    setColumnCount(列计数);
    用于(int行=0;行<400;++行)
    {
    QStringList列;
    for(int column=0;columnsectionViewportPosition(列);
    int columnY=visualItemRect(topLevelItem(0)).top();
    int columnWidth=标题()->sectionSize(列);
    int columnHeight=visualItemRect(topLevelItem(itemCount-1)).bottom()-columnY+1;
    返回QRect(columnX、columnY、columnWidth、columnHeight);
    }
    void TreeWidget::RespositionColumnWidget()
    {
    mColumnWidget->setGeometry(columnRect(3));
    }
    int main(int argc,char*argv[])
    {
    质量保证申请a(argc、argv);
    a、 setQuitOnLastWindowClosed(真);
    树篱树篱;
    调整树径(800600);
    treeWidget.show();
    返回a.exec();
    }
    #包括“main.moc”
    
    一周后我想到的想法是劫持
    QTreeWidget
    的H滚动条,然后让滚动条只滚动最后一列。因为现在,当窗口为620x670px时,所有列都适合,谁的屏幕再小


    除非有人对这是一个坏主意有更好的解决方案或反对意见,否则我将这样做。

    有什么原因不能在QHBoxLayout中将QtreeWidget放在QWidget的左侧?我需要QWidget与QtreeWidget对齐,以便我可以为列绘制自己的行。所以滚动是一个问题这里。出于好奇:为什么你需要一个单独的小部件而不是可以通信的每行小部件?我也很好奇你为什么选择这个解决方案?我的意思是,如果你的树梢很高,一个小部件看起来不好,如果它制造了这么多麻烦,它也不是一个好选择。为什么它必须是一个单独的小部件,而不是一个自定义的widget per row?从您的描述中不清楚。它是动态内容。我已经在使用setItemWidget()添加滑块。查看所有代码,没有我要添加的列。您缺少一些#includes,并且我得到一些与调用connect()相关的其他错误.我在Qt5上,你在其他版本上吗?不过,编译应该不难。它也适用于Qt5吗?不过,
    mColumnWidget->raise()
    不是必需的。我甚至无法编译它。我猜代码相当干净。那么,具体的问题是什么