【问题标题】:How to insert QPushButton into TableView?如何将 QPushButton 插入 TableView?
【发布时间】:2010-05-04 15:57:09
【问题描述】:

我正在实现QAbstractTableModel,我想在每行的最后一列插入一个QPushButton。当用户单击此按钮时,将显示一个新窗口,其中包含有关此行​​的更多信息。

您知道如何插入按钮吗?我知道委派系统,但所有示例都只是关于“如何使用组合框编辑颜色”...

【问题讨论】:

    标签: qt qt4 qabstracttablemodel


    【解决方案1】:

    你可以使用

    QPushButton* viewButton = new QPushButton("View");    
    tableView->setIndexWidget(model->index(counter,2), viewButton);
    

    【讨论】:

      【解决方案2】:

      模型-视图架构不是为了将小部件插入不同的单元格,但您可以在单元格内绘制按钮。

      区别在于:

      1. 这只是一个按钮的图纸
      2. 如果没有额外的工作(可能是相当多的额外工作),鼠标悬停时按钮不会突出显示
      3. 由于上述 #1,您不能使用信号和插槽

      也就是说,这是怎么做的:

      子类QAbstractItemDelegate(或QStyledItemDelegate)并实现paint()方法。要绘制按钮控件(或任何其他控件),您需要使用样式或 QStylePainter::drawControl() 方法:

      class PushButtonDelegate : public QAbstractItemDelegate
      {
          // TODO: handle public, private, etc.
          QAbstractItemView *view;
      
          public PushButtonDelegate(QAbstractItemView* view)
          {
              this->view = view;
          }
      
          void PushButtonDelegate::paint(
              QPainter* painter,
              const QStyleOptionViewItem & option,
              const QModelIndex & index
              ) const 
          {
              // assuming this delegate is only registered for the correct column/row
              QStylePainter stylePainter(view);
              // OR: stylePainter(painter->device)
      
              stylePainter->drawControl(QStyle::CE_PushButton, option);
              // OR: view->style()->drawControl(QStyle::CE_PushButton, option, painter, view);
              // OR: QApplication::style()->drawControl(/* params as above */);
          }
      }
      

      由于委托使您处于模型视图领域,因此请使用有关选择和编辑的视图信号来弹出您的信息窗口。

      【讨论】:

      • 投了赞成票,但想补充一点:您可以让按钮实际上是一个按钮,而不是一个按钮的绘图,但由于开销,它可能不值得。您必须创建一个自定义编辑器并让单元格在鼠标悬停时进入编辑模式。
      • 有趣的想法。这可能是可能的,但我不确定我将如何实现它。 setEditorData() 调用发生在 QAbstractItemView 的内部,所以看起来这将是很多工作,假设它是可能的。在相关的说明中,实际上很容易挂钩悬停并重新绘制以显示可见的提示。
      • 如果你想绘制一个小部件,而不仅仅是一个按钮,你的代码会发生什么变化? QStyle::CE_PushButton 是做什么的?
      【解决方案3】:

      您可以使用setCellWidget(row,column,QWidget*) 在特定单元格中设置小部件。

      【讨论】:

      • 这似乎是 QTableWidget 而不是 QTableView 的方法。
      猜你喜欢
      • 1970-01-01
      • 2021-07-26
      • 2018-05-10
      • 2013-11-26
      • 2014-04-21
      • 2013-01-29
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多