Qt 如何对小部件进行子类化以向其添加更多元素?

Qt 如何对小部件进行子类化以向其添加更多元素?,qt,subclass,qtableview,qlineedit,paintevent,Qt,Subclass,Qtableview,Qlineedit,Paintevent,我正在尝试创建QTableView的子类,该子类的顶部嵌入了QLineEdit,用于在键入时过滤结果。我需要我的表具有与普通QTableView相同的API,因此我希望对其进行子类化,而不是对QWidget进行子类化,并向其添加QLineEdit和QTableView 我想我可以重新实现paintEvent(QPaintEvent*),改变QPaintEvent的rect()开始时稍微低一点(QLineEdit的高度,因此它在它下面绘制),然后将它传递给QTableView::paintEven

我正在尝试创建
QTableView
的子类,该子类的顶部嵌入了
QLineEdit
,用于在键入时过滤结果。我需要我的表具有与普通
QTableView
相同的API,因此我希望对其进行子类化,而不是对
QWidget
进行子类化,并向其添加
QLineEdit
QTableView


我想我可以重新实现
paintEvent(QPaintEvent*)
,改变
QPaintEvent
rect()
开始时稍微低一点(QLineEdit的高度,因此它在它下面绘制),然后将它传递给
QTableView::paintEvent()
,但是
QPaintEvent
参数只指示需要重新绘制的区域,而不是小部件应该绘制的区域。

我会尝试覆盖paintEvent,将
widget::pos
更改为略低于它的值,并调用
QTableView::paintEvent()

在这方面,您所做的任何事情都将是有问题的,并且会导致与手动将所有信号和插槽映射到子小部件一样多的工作(可能更多的工作)。您需要做的不仅仅是更改绘制事件,还需要调整所有鼠标事件、调整任何更新矩形等等


或者,您可以直接从Qt源代码中获取QTableView类并对其进行修改(尽管这可能会破坏LGPL,并要求您在没有商业许可证的情况下发布源代码)但是最简单的清理方法是在孩子的时候用QTableView实现一个容器小部件。

我必须同意Daniel的观点:我认为这不是正确的方法。您可能希望创建一个带有行编辑的自定义小部件来执行过滤。否则,您将进入具有挑战性的Qt黑客世界

如果确实需要提供对QTableView接口的访问,那么只需添加一个公共get方法,该方法返回对表的引用


这有点类似于Qt如何提供一个QTabWidget类,该类继承QWidget,但具有内部使用的专用QTabBar。一个显著的区别是它提供了一个受保护的tabBar()访问器,而不是一个公共访问器。

为什么您反对创建一个组合的小部件而采取“艰难”的方式呢?因为这样代码开始如下所示:public:void setModel(QAbstractItemModel m){table->setModel(m);}QWidget horizontalHeader(){return table->horizontalHeader();}QWidget*verticalHeader(){return table->verticalHeader();}[snip]QTableView发出的所有信号都以相同的方式结束:我必须将它们全部映射到我的小部件的外部接口。或者,您可以从小部件为QTableView*创建一个getter。:)调用move()或QTableView::move()在MyTable::paintEvent()中,只转换整个小部件(包括QLineEdit成员)…我甚至不确定为什么要绘制QLineEdit,因为我的paintEvent只调用QTableView::paintEvent(),它不会显式绘制任何成员小部件。。