您可以将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文档,似乎有几个选项可以实现这一点,但是在您决定什么方法最适合您的需要之前,有几个重要因素需要解决
在为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()
不是必需的。我甚至无法编译它。我猜代码相当干净。那么,具体的问题是什么