如何实现自定义布尔小部件以与QDataWidgetMapper一起使用?

时间:2014-11-24 11:51:21

标签: qt user-interface model-view-controller

我需要实现什么才能使我自己的布尔小部件与QDataWidgetMapper一起使用?

我创建了一个USER属性,根据我的理解,映射器应该使用。

使用(相同的)QDataWidgetMapper通过QSqlTableModel与数据库的交互与qt自己的小部件一起使用,但似乎不适用于我创建的这个小部件。

即使窗口小部件工作并显示数据库数据,更改窗口小部件值也不会更改数据库中的值。 [更正:数据库中的数据被读取到小部件状态确定。]

当前头文件:

#ifndef COMPENSATIONCONTROLCHECKABLE_H
#define COMPENSATIONCONTROLCHECKABLE_H
#include <QAbstractButton>
#include <QWidget>

namespace Ui {
class CompensationControlCheckable;
}

class CompensationControlCheckable : public QAbstractButton
{
    Q_OBJECT

    Q_PROPERTY(bool checked READ isChecked WRITE setChecked NOTIFY compensationChanged USER true )

public:
    explicit CompensationControlCheckable(QWidget *parent = 0);
    ~CompensationControlCheckable();
    void setChecked(bool checkd);
    const bool isChecked() const;
    void paintEvent(QPaintEvent *e);
    void resizeEvent(QResizeEvent *e);

private slots:
    void on_startCompensation_clicked();

    void on_cancelCompensation_clicked();
signals:
    void compensationChanged(bool);
    void checked(bool);
private:
    bool checkedValue;
    Ui::CompensationControlCheckable *ui;
};

#endif // COMPENSATIONCONTROLCHECKABLE_H 

版本2,现在我已经删除了已检查的覆盖,而是分别在setCompensation和isCompensation中调用QAbstractButton setChecked和isChecked。构造函数调用setCheckable(true);.这完全如上所述;从db ok读取,写入db不起作用:

#ifndef COMPENSATIONCONTROLCHECKABLE_H
#define COMPENSATIONCONTROLCHECKABLE_H
#include <QAbstractButton>
#include <QWidget>

namespace Ui {
class CompensationControlCheckable;
}

class CompensationControlCheckable : public QAbstractButton
{
    Q_OBJECT

    Q_PROPERTY(bool compensation READ isCompensation WRITE setCompensation NOTIFY compensationChanged USER true )

public:
    explicit CompensationControlCheckable(QWidget *parent = 0);
    ~CompensationControlCheckable();
    void setCompensation(bool checkd);
    bool isCompensation() const;
    void paintEvent(QPaintEvent *e);
    void resizeEvent(QResizeEvent *e);

private slots:
    void on_startCompensation_clicked();
    void on_cancelCompensation_clicked();
signals:
    void compensationChanged(bool);
private:
    bool compensationValue;
    Ui::CompensationControlCheckable *ui;
};

#endif // COMPENSATIONCONTROLCHECKABLE_H 

1 个答案:

答案 0 :(得分:1)

QDataWidgetMapper更喜欢使用带有USER true的属性进行映射,但已经one called checked in QAbstractButton使用该属性。您可能需要在构造函数中调用isCheckable(true);