今天在 tablewidget中写了个委托。
想实现 点击委托中的editor(一个button),在主窗口能够显示菜单。 一开始就想到了信号槽机制,但是问题在于 button 是 委托中的,没法直接与主窗口进行connect。
后来发现,是自己信号槽没学好,在这里可以使用自定义的方式。
将button与委托关联,然后委托与主窗口关联。
我的实现方式:
在 委托中添加了自定义的信号以及槽函数:
signals:
void sendMessage();
public slots:
void on_Clicked(bool);
1
2
3
4
5
然后将button的clicked信号与槽函数关联,在槽函数中发送信号。
connect(button,SIGNAL(clicked(bool)),this,SLOT(on_Clicked(bool)));
1
void ComboxDelegate::on_Clicked(bool)
{
emit sendMessage();
}
1
2
3
4
最后就是在主窗口中将委托与之关联:
connect(comboxDelegate,SIGNAL(sendMessage()),this,SLOT(on_Click()));
1
在引用的博客链接中时使用的是自动连接命令方式:
void on__()
Constant
Value
Description
Qt::AutoConnection
0
自动连接:默认的方式。信号发出的线程和糟的对象在一个线程的时候相当于:DirectConnection, 如果是在不同线程,则相当于QueuedConnection
Qt::DirectConnection
2
直接连接:相当于直接调用槽函数,但是当信号发出的线程和槽的对象不再一个线程的时候,则槽函数是在发出的信号中执行的。
Qt::QueuedConnection
3
队列连接:内部通过postEvent实现的。不是实时调用的,槽函数永远在槽函数对象所在的线程中执行。如果信号参数是引用类型,则会另外复制一份的。线程安全的。
Qt::BlockingQueuedConnection
4
阻塞连接:此连接方式只能用于信号发出的线程(一般是先好对象的线程) 和 槽函数的对象不再一个线程中才能用。通过信号量+postEvent实现的。不是实时调用的,槽函数永远在槽函数对象所在的线程中执行。但是发出信号后,当前线程会阻塞,等待槽函数执行完毕后才继续执行。
Qt::UniqueConnection
0x80
防止重复连接。如果当前信号和槽已经连接过了,就不再连接了。
其中UniqueConnection只能算是一个防止重复连接的参数,并不算是一种连接方式;而AutoConnection做为默认的方式,会选择DirectConnection或者QueuedConnection