FormEditor 开发记录5 编辑器的Dirty状态设置 以及保存

有两种设置编辑器Dirty状态的策略:

1. 只要有修改,就通知Editor Dirty,这样,即便是把 0改为1,又改回为0,编辑器的状态也是Dirty

2. 修改后对比初始数据是否与修改后的不同,只有不同,才通知编辑器 Dirty,相同时,通知编辑器 没有Dirty

 

我们用第二种方式:

 1. 我们在setInput的时候,在各个需要有可能改变EditorDirty状态的控件上保存初始数据,添加一个对象保存修改的数据dirtyFields,以后可以用来判断是否dirty


ExpandedBlockStart.gif 代码
  public   void  setInput(LazyDTO project) {
        txNumber.setText(project.getText(
" md$number " ));
        addtoDirtyControl(txNumber,
" md$number " ,project.getText( " md$number " ));

...

    
private   void  addtoDirtyControl(Widget widget, String fieldname, Object initValue) {
        widget.setData(INITDATA,initValue);
        
if (widget  instanceof  Text){
            ((Text)widget).addModifyListener(
new  ModifyListener(){

                @Override
                
public   void  modifyText(ModifyEvent e) {
                    Text text 
=  (Text)e.getSource();
                    Object initData 
=  text.getData(INITDATA);
                    String fieldname 
=  (String) text.getData(FIELDNAME);
                    String newData 
=  text.getText();
                    
if (newData.equals(initData)){
                        dirtyFields.remove(fieldname);
                    }
else {
                        dirtyFields.put(fieldname, 
new  Object[]{initData,newData});
                    }
                    mform.dirtyStateChanged();
                }
            });
        }
    } 


2. FormPage类上覆盖isDirty()

ExpandedBlockStart.gif 代码
public   class  PlanPage  extends  FormPage {

    
private  LazyDTO inputData;
    
private  PlanContent pc;

    
public  PlanPage(FormEditor editor) {
        
super (editor,  " com.sg.intellifmea.editor.PlanPage " " 概览 " );
        inputData 
=  ((ProjectInput) getEditor().getEditorInput()).getData();
        
    }

    @Override
    
protected   void  createFormContent(IManagedForm managedForm) {
        FormToolkit toolkit 
=  managedForm.getToolkit();
        ScrolledForm form 
=  managedForm.getForm();
        toolkit.decorateFormHeading(form.getForm());
        form.setText(
" 项目基本信息以及计划 " );
        form.setImage(inputData.getImageDescriptor().createImage());
        
        pc 
=   new  PlanContent(managedForm);
        pc.setInput(inputData);
    }

    @Override
    
public   boolean  isDirty() {
        
return  pc.isDirty();
    }


}


3. isDirty()

     public   boolean  isDirty() {
        
return   ! dirtyFields.isEmpty();
    }


 要注意这里实现的方法可以非常灵活。

1. 可以直接为FormEditor设置 dirty,激活dirty的方法是editorDirtyStateChanged()

2. 可以在FormPage上设置dirty, 激活dirty的方法是mform.dirtyStateChanged();

任何一种方法,client都会调用各自的isDirty(),我们在isDirty中判断,是否是dirty了

 

 最后的工作就是保存了

这很简单,在Editor的doSave 调用 Page的doSave, 还可以加上 Monitor和进度条。

 只需注意2点:

1.保存后,要激活editorDirtyStateChanged()或者mform.dirtyStateChanged();

2.保存失败怎么办

 

转载于:https://www.cnblogs.com/seag/archive/2009/12/02/1615392.html

好的,下面是一个简单的示例代码,用于演示如何使用 Qt 插件机制在 Visual Studio 2022 编译器上实现一个简易计算器: 首先是 `CalculatorWidget` 类,用于实现计算器界面和逻辑: ```cpp #ifndef CALCULATORWIDGET_H #define CALCULATORWIDGET_H #include <QWidget> #include <QLineEdit> #include <QPushButton> class CalculatorWidget : public QWidget { Q_OBJECT public: explicit CalculatorWidget(QWidget *parent = nullptr); private slots: void onDigitClicked(); void onOperatorClicked(); void onEqualClicked(); void onClearClicked(); private: QLineEdit *m_display; QPushButton *m_digitButtons[10]; QPushButton *m_operatorButtons[4]; QString m_currentNumber; QString m_pendingOperator; double m_pendingOperand; bool m_waitingForOperand; }; #endif // CALCULATORWIDGET_H ``` 接下来是 `CalculatorPlugin` 类,用于实现 Qt 插件接口: ```cpp #ifndef CALCULATORPLUGIN_H #define CALCULATORPLUGIN_H #include <QObject> #include <QtDesigner/QDesignerCustomWidgetInterface> class CalculatorPlugin : public QObject, public QDesignerCustomWidgetInterface { Q_OBJECT Q_PLUGIN_METADATA(IID "org.qt-project.Qt.QDesignerCustomWidgetInterface") Q_INTERFACES(QDesignerCustomWidgetInterface) public: explicit CalculatorPlugin(QObject *parent = nullptr); QString name() const override; QString group() const override; QString toolTip() const override; QString whatsThis() const override; QIcon icon() const override; bool isContainer() const override; QWidget *createWidget(QWidget *parent) override; void initialize(QDesignerFormEditorInterface *formEditor) override; bool isInitialized() const override; void uninitialize() override; private: bool m_initialized; }; #endif // CALCULATORPLUGIN_H ``` 最后是 `CalculatorPlugin` 类的实现: ```cpp #include "calculatorplugin.h" #include "calculatorwidget.h" #include <QtPlugin> CalculatorPlugin::CalculatorPlugin(QObject *parent) : QObject(parent) { m_initialized = false; } QString CalculatorPlugin::name() const { return QStringLiteral("CalculatorWidget"); } QString CalculatorPlugin::group() const { return QStringLiteral("Custom Widgets"); } QString CalculatorPlugin::toolTip() const { return QStringLiteral("A simple calculator widget"); } QString CalculatorPlugin::whatsThis() const { return QStringLiteral("A simple calculator widget"); } QIcon CalculatorPlugin::icon() const { return QIcon(); } bool CalculatorPlugin::isContainer() const { return false; } QWidget *CalculatorPlugin::createWidget(QWidget *parent) { return new CalculatorWidget(parent); } void CalculatorPlugin::initialize(QDesignerFormEditorInterface *formEditor) { if (m_initialized) return; m_initialized = true; } bool CalculatorPlugin::isInitialized() const { return m_initialized; } void CalculatorPlugin::uninitialize() { if (!m_initialized) return; m_initialized = false; } Q_EXPORT_PLUGIN2(calculatorplugin, CalculatorPlugin) ``` 这些代码只是一个简单的示例,实现了一个基本的计算器功能。如果你需要更详细的代码实现,可以参考 Qt 的官方文档和示例代码。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值