如何将窗口小部件子类化以向其添加更多元素?

时间:2009-06-13 20:41:46

标签: qt subclass qtableview qlineedit paintevent

我正在尝试创建一个QTableView的子类,其顶部有一个嵌入式QLineEdit,用于按照您的类型过滤结果。我需要我的表具有与普通QTableView相同的API,因此我想将其子类化而不是子类化QWidget并向其添加QLineEditQTableView。< / p>

我以为我可以重新实施paintEvent(QPaintEvent*),将QPaintEvent的{​​{1}}改为开始稍低(rect()的高度,所以它绘制然后将它传递给QLineEdit,但QTableView::paintEvent()参数只规定需要重新绘制哪个区域,而不是应该绘制小部件的区域。

3 个答案:

答案 0 :(得分:7)

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

或者你可以从Qt源获取QTableView类并直接修改它(虽然这可能会破坏LGPL并要求你在没有商业许可的情况下发布你的源代码。)但是最简单的清理方法将以QTableView作为孩子实现容器小部件。

答案 1 :(得分:1)

我会尝试覆盖paintEvent,将widget::pos更改为比它低一点并调用QTableView::paintEvent()

答案 2 :(得分:1)

我必须同意丹尼尔:我不认为这是正确的做法。您可能希望使用行编辑创建自定义窗口小部件以执行过滤。否则,您将进入Qt黑客的挑战世界。

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

这有点类似于Qt提供的QTabWidget类如何继承QWidget但具有内部使用的私有QTabBar。一个显着的区别是它提供了一个 protected tabBar()访问者而不是公共访问者。