如何子类化一个小部件以向其添加更多元素?

发布于 2024-07-24 05:12:29 字数 485 浏览 12 评论 0原文

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

我想我可以重新实现 paintEvent(QPaintEvent*),改变 QPaintEventrect() 以降低一点( 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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

野生奥特曼 2024-07-31 05:12:29

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

或者,您可以从 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.

惯饮孤独 2024-07-31 05:12:29

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

I would try overriding the paintEvent, changing the widget::pos to be abit lower than it is and call QTableView::paintEvent()

凉栀 2024-07-31 05:12:29

我必须同意丹尼尔的观点:我认为这不是正确的方法。 您可能希望创建一个带有行编辑的自定义小部件来执行过滤。 否则,您将进入充满挑战的 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.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文