Qt中的QTableView 中的列放入Widget

Posted foo__hack

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Qt中的QTableView 中的列放入Widget相关的知识,希望对你有一定的参考价值。

QTableView是Qt中Model View理念的框架,View只展现数据,所以通过互交修改编辑数据,需要用到委托这个概念Delegate。

所以基本思路是继承QItemDelegate这个类,然后overried里面的方法,然后通过QTableView的成员函数setItemDelegateForColumn就可以了。

 

以下代码是在某列中添加QComboBox:

 1 ///////////////////////////EmployeePrivilegeComboxEditor.h///////////
 2 #include <QItemDelegate>
 3 #include <QStringList>
 4 
 5 class EmployeePrivilegeComboxEditor : public QItemDelegate {
 6     Q_OBJECT
 7 
 8 public:
 9     explicit EmployeePrivilegeComboxEditor(QObject* parent = Q_NULLPTR);
10     ~EmployeePrivilegeComboxEditor();
11 
12 public:
13     virtual QWidget* createEditor(QWidget* parent,
14         const QStyleOptionViewItem& option,
15         const QModelIndex& index) const override;
16 
17     virtual void setEditorData(
18         QWidget* editor, const QModelIndex& index) const override;
19 
20     virtual void setModelData(QWidget* editor, QAbstractItemModel* model,
21         const QModelIndex& index) const override;
22 
23 private:
24     QStringList items_;
25 };
26 
27 ///////////////////////////EmployeePrivilegeComboxEditor.cpp///////////
28 
29 #include "EmployeePrivilegeComboxEditor.h"
30 
31 #include <QComboBox>
32 
33 EmployeePrivilegeComboxEditor::EmployeePrivilegeComboxEditor(QObject* parent)
34     : QItemDelegate(parent)
35 {
36     items_ << QStringLiteral("普通用户") << QStringLiteral("管理员")
37            << QStringLiteral("超级管理员");
38 }
39 
40 EmployeePrivilegeComboxEditor::~EmployeePrivilegeComboxEditor() {}
41 
42 QWidget* EmployeePrivilegeComboxEditor::createEditor(QWidget* parent,
43     const QStyleOptionViewItem& option, const QModelIndex& index) const
44 {
45     QComboBox* editor = new QComboBox(parent);
46     editor->addItems(items_);
47     return editor;
48 }
49 
50 void EmployeePrivilegeComboxEditor::setEditorData(
51     QWidget* editor, const QModelIndex& index) const
52 {
53     QString text        = index.model()->data(index, Qt::EditRole).toString();
54     QComboBox* comboBox = dynamic_cast<QComboBox*>(editor);
55     if (comboBox) {
56         int tindex = comboBox->findText(text);
57         comboBox->setCurrentIndex(tindex);
58     }
59 }
60 
61 void EmployeePrivilegeComboxEditor::setModelData(
62     QWidget* editor, QAbstractItemModel* model, const QModelIndex& index) const
63 {
64     QComboBox* comboBox = dynamic_cast<QComboBox*>(editor);
65     if (comboBox) {
66         QString text = comboBox->currentText();
67         model->setData(index, text, Qt::EditRole);
68     }
69 }
70 
71 //////////////////////////Usage///////////////////////////
72 ui->employeeTable->setItemDelegateForColumn(
73         3, new EmployeePrivilegeComboxEditor(this)); 

 

以下代码是在单元格列中放置QPushButton:

  1 ///////////////////////DownloadUpdateButton.h//////////////////////
  2 #pragma once
  3 
  4 #include <QItemDelegate>
  5 #include <QString>
  6 #include <QMap>
  7 
  8 class QStyleOptionButton;
  9 
 10 class DownloadUpdateButton : public QItemDelegate
 11 {
 12     Q_OBJECT
 13 
 14 public:
 15     explicit DownloadUpdateButton(QObject *parent = Q_NULLPTR);
 16     ~DownloadUpdateButton();
 17 public:
 18     void paint(QPainter *painter, const QStyleOptionViewItem &option, 
 19         const QModelIndex &index) const override;
 20     bool editorEvent(QEvent *event, QAbstractItemModel *model, 
 21         const QStyleOptionViewItem &option, const QModelIndex &index) override;
 22 private slots:
 23    
 24 private:
 25     QString downloadStyle_;
 26     QString updateStyle_;
 27 private:
 28     QMap<QModelIndex, QStyleOptionButton*> m_btns;
 29 };
 30 
 31 ///////////////////DownloadUpdateButton.cpp///////////////////////////
 32 
 33 #include "DownloadUpdateButton.h"
 34 
 35 #include <QStyleOptionButton>
 36 #include <QMessageBox>
 37 #include <QPainter>
 38 #include <QApplication>
 39 #include <QDesktopWidget>
 40 #include <QMouseEvent>
 41 
 42 DownloadUpdateButton::DownloadUpdateButton(QObject *parent)
 43     : QItemDelegate(parent)
 44 {
 45     downloadStyle_ = "";
 46     updateStyle_ = "";
 47   
 48 }
 49 
 50 DownloadUpdateButton::~DownloadUpdateButton()
 51 {
 52 }
 53 
 54 void DownloadUpdateButton::paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const
 55 {
 56     QStyleOptionButton* button = m_btns.value(index);
 57     if (!button) {
 58         button = new QStyleOptionButton();
 59         int x, y, width, height;
 60         x = option.rect.left() + option.rect.width()/2;
 61         y = option.rect.top() + 5;
 62         width = 20;
 63         height = 20;
 64         button->rect = option.rect.adjusted(4, 4, -4, -4) /*QRect(x,y,width,height)*/;
 65         button->text = "X";
 66         button->state |= QStyle::State_Enabled;
 67 
 68         (const_cast<DownloadUpdateButton *>(this))->m_btns.insert(index, button);
 69     }
 70     painter->save();
 71 
 72     if (option.state & QStyle::State_Selected) {
 73         painter->fillRect(option.rect, option.palette.highlight());
 74 
 75     }
 76     painter->restore();
 77     QApplication::style()->drawControl(QStyle::CE_PushButton, button, painter);
 78 }
 79 
 80 bool DownloadUpdateButton::editorEvent(QEvent *event, QAbstractItemModel *model, const QStyleOptionViewItem &option, const QModelIndex &index)
 81 {
 82     int x, y, width, height;
 83     x = option.rect.left() + option.rect.width() / 2;
 84     y = option.rect.top() + 5;
 85     width = 20;
 86     height = 20;
 87 
 88     QRect btnRect(x, y, width, height);
 89     
 90     if (event->type() == QEvent::MouseButtonPress) {
 91 
 92         QMouseEvent* e = (QMouseEvent*)event;
 93 
 94         if (option.rect.adjusted(4, 4, -4, -4)/*(btnRect*/.contains(e->x(), e->y()) && m_btns.contains(index)) {
 95             m_btns.value(index)->state |= QStyle::State_Sunken;
 96         }
 97     }
 98     if (event->type() == QEvent::MouseButtonRelease) {
 99         QMouseEvent* e = (QMouseEvent*)event;
100 
101         if (option.rect.adjusted(4, 4, -4, -4)/*btnRect*/.contains(e->x(), e->y()) && m_btns.contains(index)) {
102             m_btns.value(index)->state &= (~QStyle::State_Sunken);
103 
104             QDialog *d = new QDialog();
105 
106             d->setGeometry(0, 0, 200, 200);
107             d->move(QApplication::desktop()->screenGeometry().center() - d->rect().center());
108             d->show();
109         }
110     }
111     return true;
112 }
113 
114 ///////////////////////Usage//////////////////////////
115  ui->appTable->setItemDelegateForColumn(
116         5, new DownloadUpdateButton(this)); //给第5列添加一个按钮

 

rerferences:

https://www.cnblogs.com/li-peng/p/3961843.html

https://www.cnblogs.com/li-peng/p/4029885.html

http://www.qtcn.org/bbs/simple/?t60567.html

https://stackoverflow.com/questions/11777637/adding-button-to-qtableview

以上是关于Qt中的QTableView 中的列放入Widget的主要内容,如果未能解决你的问题,请参考以下文章

Qt如何按比例分配QTableView的列宽并且充满整个控件

QTableView中的可编辑复选框仅列

如何在 QTableView 的列中显示下拉列表并根据下拉列表进行过滤

QTableView 中的 Qt 复选框

使用 beginMoveColumns 在 QTableView (QAbstractTableModel) 中的列没有正确移动?

QT中的QtableWidget和QtableView使用有啥区别?