C++ 通过Qt中的QDataWidgetMapper将单选按钮连接到QSqlTableModel

C++ 通过Qt中的QDataWidgetMapper将单选按钮连接到QSqlTableModel,c++,qt,user-interface,orm,C++,Qt,User Interface,Orm,我想根据将单选按钮映射到QDataWidgetMapper。不过,我不知道如何联系上述代表。有人能解释一下吗 我已经有了包含QLineEdits等单选按钮的.ui文件。这些文件已经通过QDataWidgetMapper连接到QSqlTableModel。我是否可以使用上面url中提到的解决方案将.ui字段中现有的单选按钮添加到按钮组中,并将状态添加到DB中 我的单选按钮实际上是二进制选择,因此在db中存储布尔值就足够了。我不想使用复选框,因为在本例中,单选按钮使用户更容易理解选择 到目前为止,我

我想根据将单选按钮映射到QDataWidgetMapper。不过,我不知道如何联系上述代表。有人能解释一下吗

我已经有了包含QLineEdits等单选按钮的.ui文件。这些文件已经通过QDataWidgetMapper连接到QSqlTableModel。我是否可以使用上面url中提到的解决方案将.ui字段中现有的单选按钮添加到按钮组中,并将状态添加到DB中

我的单选按钮实际上是二进制选择,因此在db中存储布尔值就足够了。我不想使用复选框,因为在本例中,单选按钮使用户更容易理解选择

到目前为止,我已经在example.h文件中添加了include

#include <QWidget>
#include <QButtonGroup>
#include <QVBoxLayout>
#include <QAbstractButton>

代理需要连接到映射器

我已经创建了一个在

也在:

以下是我在实践中需要了解的要点:

QDataWidgetMapper* mapper = new QDataWidgetMapper(this);
mapper->setModel(model);
mapper->toLast();

QRadioButton *b1=new QRadioButton("a",this);
QRadioButton *b2=new QRadioButton("b",this);

RadioButtonDelegate *delegate=new RadioButtonDelegate(this);
ButtonGroup *group=new ButtonGroup(this);
mapper->addMapping(group,model->fieldIndex("radio"));

// set the delegate as the item delegate of mapper
mapper->setItemDelegate(delegate);
// connect value change in group to delegate so it can send appropriate signals 
connect(group,SIGNAL(buttonClicked(int)),delegate,SLOT(commitMyData()));

group->addButton(b1,1);
group->addButton(b2,0);
buttongroup.cpp的来源:

#include "buttongroup.h"

ButtonGroup::ButtonGroup(QWidget *parent) :
    QWidget(parent)
{
    m_buttonGroup=new QButtonGroup(this);
    connect(m_buttonGroup,SIGNAL(buttonClicked(int)),this,SIGNAL(buttonClicked(int)));

}

int ButtonGroup::getCheckedId()
{
    int id=m_buttonGroup->id(m_buttonGroup->checkedButton());
    return id;
}

void ButtonGroup::checkId(int id)
{
    m_buttonGroup->button(id)->setChecked(true);
}

void ButtonGroup::addButton(QAbstractButton *button, int id)
{
    m_buttonGroup->addButton(button,id);
}
h(与原始url相比,这里没有什么新内容):

\ifndef按钮组
#定义按钮组
#包括
#包括
#包括
#包括
#包括
类按钮组:公共QWidget
{
Q_对象
公众:
显式按钮组(QWidget*parent=0);
Q_属性(int-checkedId-READ-getCheckedId-WRITE-checkId-USER-true)
int getcheckedd();
无效检查id(内部id);
void addButton(QAbstractButton*按钮,int id);
信号:
无效按钮点击(int);
私人:
QButtonGroup*m_buttonGroup;
QVBoxLayout*m_布局;
};
#endif//按钮组
radiobuttondelegate.h(这里也不是什么新鲜事):

\ifndef radiobuttonedelegate\u H
#定义RadioButtonLegate_H
#包括
类RadioButtonDelegate:公共QItemDelegate
{
Q_对象
公众:
显式RadioButtonDelegate(QObject*parent=0);
信号:
公众时段:
void committemydata();
};
#endif//radiobuttonedelegate\u H
radiobuttondelegate.cpp(或此处):

#包括“radiobuttonedelegate.h”
#包括
RadioButtonDelegate::RadioButtonDelegate(QObject*父对象):
QItemDelegate(家长)
{
}
void radiobuttonedelegate::commitMyData(){
QWidget*obj=qobject_cast(sender());
发送提交数据(obj);
发射闭合编辑器(obj);
qDebug()
#include "buttongroup.h"

ButtonGroup::ButtonGroup(QWidget *parent) :
    QWidget(parent)
{
    m_buttonGroup=new QButtonGroup(this);
    connect(m_buttonGroup,SIGNAL(buttonClicked(int)),this,SIGNAL(buttonClicked(int)));

}

int ButtonGroup::getCheckedId()
{
    int id=m_buttonGroup->id(m_buttonGroup->checkedButton());
    return id;
}

void ButtonGroup::checkId(int id)
{
    m_buttonGroup->button(id)->setChecked(true);
}

void ButtonGroup::addButton(QAbstractButton *button, int id)
{
    m_buttonGroup->addButton(button,id);
}
#ifndef BUTTONGROUP_H
#define BUTTONGROUP_H

#include <QWidget>
#include <QButtonGroup>
#include <QVBoxLayout>
#include <QAbstractButton>
#include <QRadioButton>

class ButtonGroup : public QWidget
{
    Q_OBJECT
public:
    explicit ButtonGroup(QWidget *parent = 0);

    Q_PROPERTY(int checkedId READ getCheckedId WRITE checkId USER true)
    int getCheckedId();
    void checkId(int id);

    void addButton(QAbstractButton *button, int id);

signals:
    void buttonClicked(int);

private:
    QButtonGroup *m_buttonGroup;
    QVBoxLayout *m_layout;


};

#endif // BUTTONGROUP_H
#ifndef RADIOBUTTONDELEGATE_H
#define RADIOBUTTONDELEGATE_H

#include <QItemDelegate>

class RadioButtonDelegate : public QItemDelegate
{
    Q_OBJECT
public:
    explicit RadioButtonDelegate(QObject *parent = 0);

signals:

public slots:

    void commitMyData();
};

#endif // RADIOBUTTONDELEGATE_H
#include "radiobuttondelegate.h"
#include <QDebug>
RadioButtonDelegate::RadioButtonDelegate(QObject *parent) :
    QItemDelegate(parent)
{
}
void RadioButtonDelegate::commitMyData() {
    QWidget *obj = qobject_cast<QWidget*>(sender());
    emit commitData(obj);
    emit closeEditor(obj);

    qDebug() << "commitMyData";
}