我还在学习Qt,我非常感谢SO社区为我提供了很好的,非常及时的Qt问题答案.谢谢.
我对在标题中添加标题的想法感到很困惑QTableWidget
.我想做的是有一个包含团队成员信息的表.每个row
成员都应该包含他的名字和姓氏,每个名字都在自己的单元格中,一个单元格中有一个电子邮件地址,另一个单元格中有办公室.我将header
在这些列上方添加适当的名称.
我试图轻松开始,只需要标题显示"Last"(如姓氏).这是我的代码.
int column = m_ui->teamTableWidget->columnCount();
m_ui->teamTableWidget->setColumnCount(column+1);
QString* qq = new QString("Last");
m_ui->teamTableWidget->horizontalHeader()->model()->setHeaderData(0,
Qt::Horizontal, QVariant(QVariant::String, &qq));
Run Code Online (Sandbox Code Playgroud)
我的表被正确呈现,但标题不包含我期望的内容.它包含1个包含文本"1"的单元格.
我显然在做一些非常愚蠢的事情,这是错误的,但我迷失了.我一直在倾注文件,一无所获.
感谢您的帮助.
问题:我需要将小像素图绘制QHeaderView
到此图中所示的部分(像素图位于该部分的右角,标有红色方块):
据我了解,有两种方法可以做到:
重新实施QHeaderView
的paintSection()
方法.
从QStyledItemDelegate
类创建委托并重新实现paint()
方法.
如果我使用下面的代码尝试(1)变体,则根本不显示过滤器像素图:
void DecorativeHeaderView::paintSection( QPainter* painter, const QRect& rect, int logicalIndex ) const
{
if( !rect.isValid() )
{
return;
}
// get the state of the section
QStyleOptionHeader option;
initStyleOption( &option );
// setup the style options structure
option.rect = rect;
option.section = logicalIndex;
option.iconAlignment = Qt::AlignVCenter | Qt::AlignHCenter;
QVariant variant = model()->headerData( logicalIndex, orientation(), Qt::DecorationRole );
option.icon = qvariant_cast< QIcon >( variant ); …
Run Code Online (Sandbox Code Playgroud) 这个问题是这篇文章的进一步发展,并且有所不同,尽管可能看起来与此类似.
我正在尝试重新实现QHeaderView::paintSection
,以便从模型返回的背景将得到尊重.我试着这样做
void Header::paintSection(QPainter * painter, const QRect & rect, int logicalIndex) const
{
QVariant bg = model()->headerData(logicalIndex, Qt::Horizontal, Qt::BackgroundRole);
// try before
if(bg.isValid()) // workaround for Qt bug https://bugreports.qt.io/browse/QTBUG-46216
painter->fillRect(rect, bg.value<QBrush>());
QHeaderView::paintSection(painter, rect, logicalIndex);
// try after
if(bg.isValid()) // workaround for Qt bug https://bugreports.qt.io/browse/QTBUG-46216
painter->fillRect(rect, bg.value<QBrush>());
}
Run Code Online (Sandbox Code Playgroud)
然而,它没有用 - 如果我QHeaderView::paintSection
打电话,我画画的任何东西都是可见的(我也尝试画一条对角线).如果我删除了QHeaderView::paintSection
呼叫,则可以看到线路和背景.在fillRect
之前和之后进行通话QHeaderView::paintSection
没有任何区别.
我想知道,是什么QHeaderView::paintSection
让我无法在它上面画出一些东西.是否有办法克服它而不重新实现每一个什么QHeaderView::paintSection
呢?
我需要做的就是为某个单元添加一定的阴影 - 我仍然希望单元格中的所有内容(文本,图标,渐变背景等)都可以像现在一样进行绘制......
我正在创建一个保存对象发送服务数据的应用程序。
我创建了以Qt
,类型的模型QStandardItemModel
,我想与显示QtableView
。
但QtableView
向我显示左侧的线路电平。如果可能,我想删除它或隐藏它。
我也有一个标题问题,我想将其水平分成两个,然后将底部的相应部分垂直分成两个。这些划分的原因是我有两个开头相似的标题(通信日期和通信编号)
谢谢你的回复,因为这对我来说真的很重要。
我有一个 QTableWidget,最后一列包含可变长度的文本。
我想根据该部分的大小将 QHeaderView 的最后一部分拉伸或调整为其内容的大小。如果内容大小不超过小部件中的剩余空间,我想拉伸它(以防止小部件中出现丑陋、未填充的空间)。我可以通过使用setStretchLastSection(True)
. 但是,如果内容大小超过拉伸的列,则内容的最后部分将被剪切,因为该列未调整大小。QHeaderViewResizeToContents
为这种情况提供了ResizeMode,但在内容较短的情况下,这会使小部件具有未填充的空间。
我想过手动调整列大小。不幸的是,由于sectionSizeFromContents()
受保护,我无法直接访问内容大小。我想我可以继承 QHeaderView 并重新实现它,但我想知道是否有更好的解决方案。
我正在尝试创建一个TableView
具有排序功能的。如果我将TableView
obj 设置为我的自定义HeaderView
,则单击标题将不会排序,即使我的自定义HeaderView
没有重新实现任何内容。如果我使用 的TableView
header ( hh=tv.horizontalHeader()
) 来代替,它就会排序。我究竟做错了什么?
代码如下:
import sys
import operator
from PyQt5 import QtWidgets
from PyQt5.QtCore import QAbstractTableModel, Qt, QVariant
class TableModel(QAbstractTableModel):
def __init__(self, parent, datain, headerdata):
super(TableModel,self).__init__(parent)
self.arraydata=datain
self.headerdata=headerdata
def rowCount(self,p):
return len(self.arraydata)
def columnCount(self,p):
if len(self.arraydata)>0:
return len(self.arraydata[0])
return 0
def data(self, index, role):
if not index.isValid():
return QVariant()
elif role != Qt.DisplayRole:
return QVariant()
return QVariant(self.arraydata[index.row()][index.column()])
def headerData(self, col, orientation, role):
if orientation==Qt.Horizontal and role==Qt.DisplayRole: …
Run Code Online (Sandbox Code Playgroud) 我已经编写了多列QTreeView的后代。我想创建一个弹出菜单,当用户右键单击列标题时出现。我已经尝试从QTreeView捕获信号,但是QTreeView似乎没有在标头上发出信号。QTreeView.header()可以。因此,我相信我必须执行以下任一操作:
1:将QHeaderView的信号之一连接到弹出功能-我一直无法找到单击一次右键即可触发的信号-我尝试了sectionClicked,sectionHandleDoubleClicked,sectionDoubleClicked,sectionPressed(双击功能未捕获到单个右键单击,但确实捕获了双击右键)
self.header().sectionClicked.connect(self.headerMenu)
self.header().sectionHandleDoubleClicked.connect(self.headerMenu)
self.header().sectionDoubleClicked.connect(self.headerMenu)
self.header().sectionPressed.connect(self.headerMenu)
Run Code Online (Sandbox Code Playgroud)
或者,
2:使用我自己的MousePressEvent函数编写QHeaderView的后代,并将其用作我的标题。到目前为止,在将新的标头类连接到QTreeView后代方面,我一直没有成功。我在运行时不断遇到Segmentation Fault,没有更多解释。
#in DiceView's init, where DiceHeaders is the QHeaderView descendant
self.setHeader(DiceHeaders())
Run Code Online (Sandbox Code Playgroud)
有任何想法吗?
我实现了从QHeaderView扩展的我自己的QHeaderView。
在使用此视图的QTableWidget上启用排序功能后,仍然无法排序。出于生气,该表最初按第一列排序。如果未将水平标题设置为自定义类,则会执行排序。
唯一的重载方法是构造函数(强制水平使用)和sizeHint()。
我需要从QHeaderView类派生的文本中绘制文本.但是这段代码不起作用.
void HeaderView::paintSection(QPainter *painter, const QRect &, int) const
{
painter->drawText(0, 0, "abcde");
}
Run Code Online (Sandbox Code Playgroud) QWidget
是否可以在 上显示自定义字符串而QHeaderView
不仅仅是通用字符串?
另外,是否可以改变唯一的高度horizontalHeaderItem
?当我这样做时它崩溃了:
(ui->myTable->horizontalHeaderItem(0))->setSizeHint(QSize(200,300));
Run Code Online (Sandbox Code Playgroud) 今天,我正在尝试配置a QTreeView
以使其符合我的要求。我的观点基本上有三列。无论列大小如何,第二和第三列的宽度应恰好为50像素。第一列应占据剩余空间。
如果放大窗口小部件,则第一列应自动占据所需的可用空间,而第二列和第三列应保留其给定的50像素宽度。
这是我到目前为止尝试过的:
main.cpp
#include <QApplication>
#include <QTreeView>
#include <QDebug>
#include <QStandardItemModel>
#include <QHeaderView>
#include "ColumnDelegate.h"
int main(int argc, char** args) {
QApplication app(argc, args);
auto widget = new QTreeView;
auto model = new QStandardItemModel;
model->insertRow(0, { new QStandardItem{ "Variable width" }, new QStandardItem{ "Fixed width 1" }, new QStandardItem{ "Fixed width 2" } });
model->insertRow(0, { new QStandardItem{ "Variable width" }, new QStandardItem{ "Fixed width 1" }, new QStandardItem{ "Fixed width 2" } });
widget->setModel(model);
widget->setItemDelegateForColumn(1, new …
Run Code Online (Sandbox Code Playgroud) 我在 QTableWidget 中对 QHeaderView 进行子类化,以提供隐藏/显示部分的自定义功能。有没有办法从标题视图中获取部分的文本?我知道我可以在表格范围内做到这一点,但这不是我想要做的。
我意识到数据存储在模型内部,但是以下测试仅返回“无”:
self.model().index(0,0).data()
Run Code Online (Sandbox Code Playgroud)