如何子类化一个小部件以向其添加更多元素?
我正在尝试创建 QTableView
的子类,它在顶部嵌入了 QLineEdit
,用于在输入时过滤结果。 我需要我的表格具有与普通 QTableView
相同的 API,因此我想对其进行子类化,而不是子类化 QWidget
并添加 QLineEdit
和QTableView
到它。
我想我可以重新实现 paintEvent(QPaintEvent*)
,改变 QPaintEvent
的 rect()
以降低一点( QLineEdit
的高度,因此它在其下方绘制),然后将其传递给 QTableView::paintEvent()
,但仅 QPaintEvent
参数指示需要重新绘制的区域,而不是应该绘制小部件的区域。
I'm trying to make a subclass of QTableView
that has an embedded QLineEdit
at the top for filtering the results as-you-type. I need my table to have the same API as a normal QTableView
, so I want to subclass it rather than subclassing QWidget
and adding a QLineEdit
and QTableView
to it.
I thought I could just re-implement paintEvent(QPaintEvent*)
, alter the QPaintEvent
's rect()
to start a bit lower (the height of a QLineEdit
, so it draws under it) and then pass it thru to QTableView::paintEvent()
, but the QPaintEvent
argument only dictates what region needs to be repainted, not the region where the widget should be painted.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
您在这方面所做的任何事情都将是很麻烦的,并且会导致与手动将所有信号和槽映射到子窗口小部件一样多的工作(可能更多的工作)。 您需要做的不仅仅是更改绘制事件,您还必须调整所有鼠标事件,调整任何更新矩形等。
或者,您可以从 Qt 源中获取 QTableView 类并修改直接使用它(尽管这可能会破坏 LGPL,并且如果您没有商业许可证,则需要您发布源代码。)但最简单的干净方法是使用 QTableView 作为子项来实现容器小部件。
Anything you do in this regard is going to be hacky and result in just as much work (probably more work) as manually mapping all of the signals and slots to a child widget. You'll need to do a lot more than just change the paint events, you'd also have to adjust all of the mouse events, adjust any update rectangles, etc.
Alternatively you could just take the QTableView class from the Qt source and modify it directly (though that will probably break the LGPL and require you to publish your source if you don't have a commercial license.) But the easiest clean method is going to be implementing a container widget with the QTableView as a child.
我会尝试覆盖paintEvent,将
widget::pos
更改为比它低一点,然后调用QTableView::paintEvent()
I would try overriding the paintEvent, changing the
widget::pos
to be abit lower than it is and callQTableView::paintEvent()
我必须同意丹尼尔的观点:我认为这不是正确的方法。 您可能希望创建一个带有行编辑的自定义小部件来执行过滤。 否则,您将进入充满挑战的 Qt 黑客世界。
如果您确实需要提供对 QTableView 接口的访问,那么只需添加一个返回对表的引用的公共 get 方法。
这有点类似于 Qt 提供一个 QTabWidget 类,该类继承 QWidget 但有一个内部使用的私有 QTabBar。 一个显着的区别是它提供了一个受保护的 tabBar() 访问器而不是公共访问器。
I have to agree with Daniel: I don't think this is the right approach. You will likely want to create a custom widget with a line edit for performing the filtering. Otherwise, you will be entering into the challenging world of Qt hacking.
If you really need to provide access to the QTableView interface then simply add a public get method that returns a reference to the table.
This is somewhat similar to how Qt provides a QTabWidget class that inherits QWidget but has a private QTabBar that it uses internally. One significant difference is that it provides a protected tabBar() accessor rather than a public one.