委托和事件(转)

转《理解委托和事件的好文章》,谢谢!

 

1.委派的实现过程。

首先来看一下委派,委派其实就是方法的传递,并不定义方法的实现。事件其实就是标准化了的委派,为了事件处理过程特制的、稍微专业化一点的组播委派(多点委派)。下面举一个例子,我觉得把委派的例子和事件的例子比较,会比较容易理解。

using System;
class Class1
{

       delegate int MathOp(int i1,int i2);

       static void Main(string[] args)
       {

               MathOp op1=new MathOp(Add);

               MathOp op2=new MathOp(Multiply);

               Console.WriteLine(op1(100,200));

              Console.WriteLine(op2(100,200));

               Console.ReadLine();

       }

       public static int Add(int i1,int i2)       {

               return i1+i2;

       }

       public static int Multiply(int i1,int i2)

       {

              return i1*i2;

       }

}

 

首先代码定义了一个委托mathop,其签名匹配与两个函数add()和multiply()的签名(也就是其带的参数类型数量相同):

delegate int MathOp(int i1,int i2);

main()中代码首先使用新的委托类型声明一个变量,并且初始化委托变量.注意,声明时的参数只要使用委托传递的函数的函数名,而不加括号:

mathop op1=new MathOp(Add);

(或为mathop op1=new MathOp(Multiply);)

委托传递的函数的函数体:

public static int Add(int i1,int i2)

{

       return i1+i2;

}

public static int Multiply(int i1,int i2)

{

      return i1*i2;

}

然后把委托变量看作是一个函数名,将参数传递给函数。 Console.WriteLine(op1(100,200));

console.writeline(op2(100,200));

 

 

2.事件的实现过程

using System;

class Class1
{

       static void Main(string[] args)

       {

               Student s1=new Student();

               Student s2=new Student();

               s1.RegisterOK +=new Student.DelegateRegisterOkEvent(Student_RegisterOK);

               s2.RegisterOK +=new Student.DelegateRegisterOkEvent(Student_RegisterOK);

               s1.Register();

               s2.Register();

               Console.ReadLine();

       }

       static void Student_RegisterOK()

       {

              Console.WriteLine("Hello");

       }

}

 

class Student
{

       public delegate void DelegateRegisterOkEvent();

       public event DelegateRegisterOkEvent RegisterOK;

       public string Name;

       public void Register()

       {

               Console.WriteLine("Register Method");

              RegisterOK();

       }

}

在student类中,先声明了委托delegateregisterokevent(),然后使用event和要使用的委托类型(前面定义的delegateregisterokevent委托类型)声明事件registerok(可以看作是委托的一个实例。):

public delegate void DelegateRegisterOkEvent();

public event DelegateRegisterOkEvent RegisterOK;

然后在main()函数中,实例化student类,然后s1.registerok事件委托给了student_registerok 方法。通过“+=”(加等于)操作符非常容易地为.Net对象中的一个事件添加一个甚至多个响应方法;还可以通过非常简单的“-=”(减等于)操作符取消 这些响应方法。

然后,当调用s1.register()时,事件s1.registerok发生。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Python中的QTableView是Qt的一个类,用于显示和编辑表格数据。在许多应用程序中,我们需要从数据库中检索数据并在表格中显示。使用委托(Delegate)可以实现对表格中数据的自定义显示和编辑。 在Python中,可以使用PyQt或PySide库来创建和管理QTableView。要使用数据库,我们可以使用SQLite、MySQL或其他流行的数据库管理系统(DBMS),并使用库中提供的相应模块来与数据库进行通信。 首先,我们需要将数据库数据检索到一个查询结果(QSqlQueryModel)中。然后,创建一个QTableView来显示查询结果。 使用委托可以实现对特定列的数据进行自定义显示和编辑。委托是一个QItemDelegate的子类,可以重写其中的方法来自定义显示和编辑行为。 例如,如果我们想在表格中的某一列显示一个按钮,可以创建一个自定义委托,并在其paint()方法中绘制一个按钮。然后,将该委托设置给要显示按钮的列。同样地,我们可以在委托的editorEvent()方法中处理按钮的点击事件。 另一个常见的使用委托的例子是在表格中显示和编辑日期。可以创建一个自定义委托,在其setEditorData()方法中将日期值换为字符串,并在setModelData()方法中将字符串值换回日期值。 使用委托可以实现更多的自定义显示和编辑行为,比如显示进度条、图像等。根据需求,我们可以创建多个委托,并将其设置给不同的列,以实现不同的效果。 总之,Python的QTableView可以通过使用委托实现对数据库数据的自定义显示和编辑。通过重写委托的方法,我们可以实现各种自定义的显示和编辑行为。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值