【问题标题】:How to subclass a widget to add more elements to it?如何对小部件进行子类化以向其添加更多元素?
【发布时间】:2010-11-02 18:02:21
【问题描述】:

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

我想我可以重新实现paintEvent(QPaintEvent*),将QPaintEventrect() 改得低一点(QLineEdit 的高度,所以它在它下面绘制)然后通过它到QTableView::paintEvent(),但QPaintEvent 参数只指示需要重新绘制的区域,而不是应该绘制小部件的区域。

【问题讨论】:

  • 你为什么反对制作组合小部件并走“硬”路?
  • 因为代码开始看起来像这样: public: void setModel(QAbstractItemModel m){ table->setModel(m); } QWidget Horizo​​ntalHeader(){ return table->horizo​​ntalHeader(); } QWidget* verticalHeader(){ return table->verticalHeader(); [snip] QTableView 发出的所有信号都以相同的方式结束:我必须将它们全部映射到我的小部件的外部接口。
  • 或者您可以从您的小部件中为 QTableView* 创建一个吸气剂。 :)

标签: qt subclass qtableview qlineedit paintevent


【解决方案1】:

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

或者,您也可以从 Qt 源代码中获取 QTableView 类并直接修改它(尽管这可能会破坏 LGPL,并且如果您没有商业许可证,则需要您发布源代码。)但是最简单的清理方法将实现一个以 QTableView 作为子级的容器小部件。

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • 在 MyTable::paintEvent() 中调用 move() 或 QTableView::move() 只会翻译整个小部件(包括 QLineEdit 成员)。我什至不确定为什么要使用 QLineEdit绘制,因为我的paintEvent 只调用QTableView::paintEvent(),它没有显式绘制任何成员小部件..
    【解决方案3】:

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

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

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

    【讨论】:

      猜你喜欢
      • 2010-11-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多