CheckBox, ComboBox 객체 생성

CheckBox, ComboBox 사용

QTableView에서 QStandardItemModel Class를 통해 Table 형식으로 Data를 처리할 수 있습니다.
이번 포스팅에서는 Table 내 Data를 CheckBox와 ComboBox의 형태로 삽입하는 방법을 설명드리겠습니다.

Data를 정적인 Text 형태나 사용자에게 입력을 받아 추가할 경우도 있습니다. 
하지만 때론 CheckBox를 통해 Check 유무에 따라 해당 행이나 열을 관리할 수도 있고, 

ComboBox를 통해 특정한 범주 안에서 사용자가 Data를 선택할 수 있도록 미리 구현이 가능합니다.

CheckBox와 ComboBox를 활용하여 Table을 작성하면 더욱 유동적이고 효율적인 프로그램을 만들 수 있습니다.

Table에 각각의 객체를 생성하여 삽입하는 순서입니다.

 

CheckBox 삽입

CheckBox를 사용하려면 Project에 아래의 checkboxdelegate.h 와 checkboxdelegate.cpp 파일을 추가해줘야 합니다.
이후, CheckBoxDelegate 객체를 생성하여 QTableView의 setItemDelegateForColumn() 함수로 적용 가능합니다.


setItemDelegateForColumn 첫 번째 인자는 생성할 열, 두 번째 인자는 생성한 CheckBoxDelegate 객체의 자리입니다.

CheckBoxDelegate *f_checkboxdelegate = new CheckBoxDelegate(ui->tableView);
ui->tableView->setItemDelegateForColumn(0, f_checkboxdelegate);

 

ComboBox 삽입

ComboBox를 사용하려면 Project에 아래의 comboboxdelegate.h 와 checkboxdelegate.cpp 파일을 추가해줘야 합니다.
이후, CheckBoxDelegate 객체를 생성하여 QTableView의 setItemDelegateForColumn() 함수로 적용 가능합니다.


setItemDelegateForColumn첫 번째 인자는 생성할 열, 두 번째 인자는 생성한 CheckBoxDelegate 객체의 자리입니다.

ComboBoxDelegate *f_combodelegate = new ComboBoxDelegate(ui->tableView);
ui->tableView->setItemDelegateForColumn(1, f_combodelegate);

 

CheckBox 및 ComboBox 설명 및 예제

ComboBox의 경우 checkboxdelegate.cpp 내

QWidget* ComboBoxDelegate::createEditor(QWidget* parent, const QStyleOptionViewItem& option, const QModelIndex& index) const

함수에서 행이나 열의 값을 비교하여 단순 Return을 시키거나 값에 따라 다른 Data를 가지고 있는 ComboBox의 집합을 만들 수 있습니다.

 

예시의 경우 두 번째 열에 ComboBox를 생성 할 경우 ComboBox1~ComboBox4만 처리가 가능하고,

세 번째 열에 ComboBox를 생성 할 경우 ComboBox5~ComboBox8 값에 대한 처리를 하도록 만들었습니다.

CheckBox는 어떤 경우나 한 가지의 모양으로 생성하지만 ComboBox의 경우 Table의 종류나 행과 열에 따라서 다른 값이 들어갈 수도 있기 때문입니다.

 

해당 처리는 index.row(), index.column() 함수를 통해 처리가 가능하고, 객체 생성 시 생성자에 매개변수 값을 통해 받아와서도 처리가 가능합니다. 물론 생성자의 매개변수 형을 알맞게 선언해줘야 합니다.

 

mainwindow.h 및 mainwindow.cpp

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
// mainwindow.h
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
 
#include <QMainWindow>
#include <QStandardItemModel>
 
namespace Ui {
class MainWindow;
}
 
class MainWindow : public QMainWindow
{
    Q_OBJECT
 
public:
    explicit MainWindow(QWidget *parent = 0);
    void GridTableView();
    ~MainWindow();
 
private slots:
 
private:
    Ui::MainWindow *ui;
    QStandardItemModel *gridmodel;
};
 
#endif // MAINWINDOW_H
 
 
// mainwindow.cpp
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include "checkboxdelegate.h"
#include "comboboxdelegate.h"
 
MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
 
    GridTableView();
}
 
MainWindow::~MainWindow()
{
    delete ui;
}
 
void MainWindow::GridTableView()
{
    QModelIndex index;
    gridmodel = new QStandardItemModel(155this);
    ui->tableView->setModel(gridmodel);
 
    gridmodel->setHorizontalHeaderItem(0new QStandardItem(QString("CheckBox")));
    gridmodel->setHorizontalHeaderItem(1new QStandardItem(QString("ComboBox1")));
    gridmodel->setHorizontalHeaderItem(2new QStandardItem(QString("ComboBox2")));
    gridmodel->setHorizontalHeaderItem(3new QStandardItem(QString("Data1")));
    gridmodel->setHorizontalHeaderItem(4new QStandardItem(QString("Data2")));
 
    for (int row = 0; row < 15; row++)
    {
        for (int col = 0; col < 5; col++)
        {
            index = gridmodel->index(row, col, QModelIndex());
            gridmodel->setData(index,"");
            ui->tableView->setColumnWidth(col, 120);
        }
            ui->tableView->setRowHeight(row, 30);
    }
 
    CheckBoxDelegate *f_checkboxdelegate = new CheckBoxDelegate(ui->tableView);
    ui->tableView->setItemDelegateForColumn(0, f_checkboxdelegate);
 
    ComboBoxDelegate *f_combodelegate = new ComboBoxDelegate(ui->tableView);
    ui->tableView->setItemDelegateForColumn(1, f_combodelegate);
 
    ComboBoxDelegate *s_combodelegate = new ComboBoxDelegate(ui->tableView);
    ui->tableView->setItemDelegateForColumn(2, s_combodelegate);
}

 

checkboxdelegate.h 및 checkboxdelegate.cpp

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
// checkboxdelegate.h
#ifndef CHECKBOXDELEGATE_H
#define CHECKBOXDELEGATE_H
 
#include <QStyledItemDelegate>
 
class CheckBoxDelegate : public QStyledItemDelegate
{
    Q_OBJECT
public:
    explicit CheckBoxDelegate( QObject *parent = 0 );
 
    void paint( QPainter *painter,
                const QStyleOptionViewItem &option,
                const QModelIndex &index ) const;
 
    bool editorEvent( QEvent *event,
                      QAbstractItemModel *model,
                      const QStyleOptionViewItem &option,
                      const QModelIndex &index );
};
 
#endif // CHECKBOXDELEGATE_H
 
 
// checkboxdelegate.cpp
#include "checkboxdelegate.h"
 
#include <QApplication>
#include <QCheckBox>
 
CheckBoxDelegate::CheckBoxDelegate( QObject *parent )
    : QStyledItemDelegate(parent)
{
}
 
void CheckBoxDelegate::paint( QPainter *painter,
                              const QStyleOptionViewItem &option,
                              const QModelIndex &index ) const
{
    bool value = index.data().toBool();
    QStyleOptionButton cbo;
 
   cbo.rect = option.rect;
   cbo.rect.setLeft( option.rect.center().x() - 7 );
   cbo.state = value ? QStyle::State_On : QStyle::State_Off;
    cbo.text = "";
   cbo.state = cbo.state | QStyle::State_Enabled;
 
 
    qApp->style()->drawControl( QStyle::CE_CheckBox,&cbo, painter );
}
 
bool CheckBoxDelegate::editorEvent( QEvent *event,
                                    QAbstractItemModel *model,
                                    const QStyleOptionViewItem &option,
                                    const QModelIndex &index )
{
    Q_UNUSED(option);
 
    if( event->type() == QEvent::MouseButtonRelease )
        return false;
 
    model->setData( index, !index.data().toBool() );
 
    return event->type() == QEvent::MouseButtonDblClick ? true : false;
}

 

comboboxdelegate.h 및 comboboxdelegate.cpp

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
// comboboxdelegate.h
#define COMBOBOXDELEGATE_H
 
#include <QStyledItemDelegate>
#include <QComboBox>
#include <QStandardItemModel>
 
class ComboBoxDelegate : public QStyledItemDelegate
{
    Q_OBJECT
public:
    ComboBoxDelegate(QObject* parent=0);
    ~ComboBoxDelegate();
 
    QWidget *createEditor( QWidget *parent,
                               const QStyleOptionViewItem &option,
                               const QModelIndex &index) const;
 
       void setEditorData( QWidget *editor,
                               const QModelIndex &index ) const;
 
       void setModelData( QWidget *editor,
                               QAbstractItemModel *model,
                               const QModelIndex &index ) const;
 
       void updateEditorGeometry( QWidget *editor,
                               const QStyleOptionViewItem &option,
                               const QModelIndex &index ) const;
 
       QStringList comboItems;
       mutable QComboBox *combo;
};
 
#endif // COMBOBOXDELEGATE_H
 
 
// comboboxdelegate.cpp
#include "comboboxdelegate.h"
#include <QComboBox>
 
ComboBoxDelegate::ComboBoxDelegate(QObject* parent)
    : QStyledItemDelegate(parent)
{
 
}
 
ComboBoxDelegate::~ComboBoxDelegate()
{
 
}
 
QWidget* ComboBoxDelegate::createEditor(QWidget* parent, const QStyleOptionViewItem& option, const QModelIndex& index) const
{
    // ComboBox ony in column 2
    if ((index.column() != 1&& (index.column() != 2))
        return QStyledItemDelegate::createEditor(parent, option, index);
 
    // Create the combobox and populate it
    QComboBox* cb = new QComboBox(parent);
 
    if(index.column() == 1)
    {
        cb->addItem(QString("ComboBox1"));
        cb->addItem(QString("ComboBox2"));
        cb->addItem(QString("ComboBox3"));
        cb->addItem(QString("ComboBox4"));
    }
 
    else if(index.column() == 2)
    {
        cb->addItem(QString("ComboBox5"));
        cb->addItem(QString("ComboBox6"));
        cb->addItem(QString("ComboBox7"));
        cb->addItem(QString("ComboBox8"));
    }
 
    return cb;
}
 
void ComboBoxDelegate::setEditorData(QWidget* editor, const QModelIndex& index) const
{
    QString text = index.model()->data( index, Qt::DisplayRole ).toString();
 
        int comboIndex = comboItems.indexOf(QRegExp(text));
 
        if(comboIndex>=0)
            (static_cast<QComboBox*>( editor ))->setCurrentIndex(comboIndex);
}
 
void ComboBoxDelegate::setModelData(QWidget* editor, QAbstractItemModel* model, const QModelIndex& index) const
{
    model->setData( index, static_cast<QComboBox*>( editor )->currentText() );
}
 
void ComboBoxDelegate::updateEditorGeometry(QWidget *editor, const QStyleOptionViewItem &option, const QModelIndex &index) const
{
    editor->setGeometry( option.rect );
}

 

Result Image