【问题标题】:How to implement custom boolean widget for use with QDataWidgetMapper?如何实现自定义布尔小部件以与 QDataWidgetMapper 一起使用?
【发布时间】:2014-11-24 11:51:20
【问题描述】:

我必须实现什么才能使我自己的布尔小部件与 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 读取正常,写入 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 

【问题讨论】:

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


    【解决方案1】:

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

    【讨论】:

    • QDataWidgetMapper 的 5.3 文档说明了以下内容,所以我上面的 USER 属性应该可以吗?你从哪里得到value 属性的想法? “默认情况下,每个小部件的用户属性都用于在模型和小部件之间传输数据。从 Qt 4.3 开始,额外的 addMapping() 函数可以使用命名属性而不是默认用户属性。”
    • 确实:再看一遍QAbstractButton 已经有一个名为checked 的用户属性
    • 那么,你到底在说什么?我上面的例子应该有效吗? (Q更新了,其实是从db读取的ok,只是不写db)
    • 您应该从标头中删除所有已检查的相关内容(以及来自CompensationControlCheckable 的实现,而是使用来自QAbstractButton 的相同方法
    • 在原始问题中添加了新版本,但效果并不好。
    猜你喜欢
    • 2021-03-08
    • 2011-02-08
    • 2013-02-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-08
    相关资源
    最近更新 更多