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

标签 c++ qt user-interface orm

我想根据 this forum thread 将单选按钮映射到 QDataWidgetMapper .我不确定如何连接提到的代表。谁能解释一下?

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

我的单选按钮实际上是二进制选择,因此在数据库中存储 bool 值就足够了。我不想使用复选框,因为在这种情况下,单选按钮使用户更容易理解选择。

到目前为止,我已经将包含添加到示例 .h 文件中

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

并创建了 .cpp 文件。

#include "buttongroup.h"

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

}

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);
    m_layout->addWidget(button);
    //connect(button,SIGNAL(clicked()),this,SIGNAL(buttonClicked()));
}

最佳答案

委托(delegate)需要连接到映射器。

我创建了一个在 http://scanrobot.fi/wp-content/uploads/2015/06/qradiobutton-qsqltablemodel.zip 工作的示例项目

同时在:https://github.com/savolai/qt_qradiobutton_qdatawidgetmapper_example

以下是我在实践中需要理解的本质:

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);
}

buttongroup.h(与原始 url 相比,这里没有什么新内容):

#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

radiobuttondelegate.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

radiobuttondelegate.cpp(或此处):

#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";
}

关于c++ - 通过 Qt 中的 QDataWidgetMapper 将单选按钮连接到 QSqlTableModel,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31021852/

相关文章:

java - 使用 GUI (Java) 启动线程

c++ - 分数类增量运算符重载解释

user-interface - 在 Google Apps 脚本 Google Sheets Workspace 插件中使用 CardService 时出错

c++ - C++中的"Free"数组元素

c++ - 信号和插槽在 qt 中不起作用

c++ - QTableWidget单元格更新

c++ - 有没有办法将 QMetaEnum 与属于非 Q_OBJECT 或 Q_GADGET 类的 Q_ENUMS 一起使用?

java - 如果只有一个选项卡存在,有没有办法隐藏 JTabbedPane 的选项卡栏?

c++ - MinGW g++ 生成(据称)16 位二进制

c++ - 有没有办法使用opencv检测图像中的相邻圆