QT信号和槽求助

QT信号和槽求助,第1张

那个就叫信号,不是信号函数,也不能有函数体。

只是消息的代称,仅用于触发执行槽函数。

信号声明里的参数就是槽函数的参数,二者声明完全一致的。

看到int甭管,去找槽函数里实际的参数声明就行了。

真实存在的函数只有槽函数一个。

QT是一个跨平台的C++ GUI应用构架,它提供了丰富的窗口部件集,具有面向对象、易于扩展、真正的组件编程等特点,更为引人注目的是目前Linux上最为流行的KDE桌面环境就是建立在QT库的基础之上。QT支持下列平台:MS/WINDOWS-95、98、NT和2000;UNIX/X11-Linux、Sun Solaris、HP-UX、Digital Unix、IBM AIX、SGI IRIX;EMBEDDED-支持framebuffer的Linux平台。伴随着KDE的快速发展和普及,QT很可能成为Linux窗口平台上进行软件开发时的GUI首选。

概述

信号和槽机制是QT的核心机制,要精通QT编程就必须对信号和槽有所了解。信号和槽是一种高级接口,应用于对象之间的通信,它是QT的核心特性,也是QT区别于其它工具包的重要地方。信号和槽是QT自行定义的一种通信机制,它独立于标准的C/C++语言,因此要正确的处理信号和槽,必须借助一个称为moc(Meta Object Compiler)的QT工具,该工具是一个C++预处理程序,它为高层次的事件处理自动生成所需要的附加代码。

在我们所熟知的很多GUI工具包中,窗口小部件(widget)都有一个回调函数用于响应它们能触发的每个动作,这个回调函数通常是一个指向某个函数的指针。但是,在QT中信号和槽取代了这些凌乱的函数指针,使得我们编写这些通信程序更为简洁明了。 信号和槽能携带任意数量和任意类型的参数,他们是类型完全安全的,不会像回调函数那样产生core dumps。

所有从QObject或其子类(例如Qwidget)派生的类都能够包含信号和槽。当对象改变其状态时,信号就由该对象发射(emit)出去,这就是对象所要做的全部事情,它不知道另一端是谁在接收这个信号。这就是真正的信息封装,它确保对象被当作一个真正的软件组件来使用。槽用于接收信号,但它们是普通的对象成员函数。一个槽并不知道是否有任何信号与自己相连接。而且,对象并不了解具体的通信机制。

你可以将很多信号与单个的槽进行连接,也可以将单个的信号与很多的槽进行连接,甚至于将一个信号与另外一个信号相连接也是可能的,这时无论第一个信号什么时候发射系统都将立刻发射第二个信号。总之,信号与槽构造了一个强大的部件编程机制。

信号和槽是类型安全的(签名相符的),即信号和槽的参数类型个数必须相同,或者槽的参数的个数可以少于信号的参数个数,但缺少的参数必须是信号参数的最后一个或几个参数。

对,信号可以自己定义

而信号一般是只声明函数体,关键是其参数

信号一般是用来传参或者是一种逻辑的调用者

信号的发射可以在你自定义的函数中

就比如我们继承了一个widget,要重写mousePressEvent

于是我们就可以自己定义一个signal, MyClicked( const QPoint& pos )

然后在事件中emit( MyClicked( event->pos() ) )

不过一般clicked信号是在mouseReleaseEvent中emit的

当然这一切都必须你继承QObject以及声明Q_OBJECT了

而且你也可以把你自己的一些属性property声明至元系统

就是宏Q_PROPERTY()

这个其实很有用,举个例子

我们想知道信号发送者的某一个属性

于是我已经Connect了

然后我们就可以在对应的槽中获取

用sender()获取object对象然后调用property来获取发送者的某个属性

还是自己多运用吧

以上都我自己打的阿~ 你还有不会的可以hi我

你的意思是子窗口中的一个按钮被点击了,父窗口上的一个slot函数响应这个点击吧?

很简单的:

1)在子窗口里面增加一个signal,在父窗口里面增加一个响应slot用于接收这个信号。

2)子窗口的按钮slot函数中emit这个signal。

3)在父窗口中把子窗口的这个signal连到自己的响应slot。

// 子窗口

class ChildWindow : public QWidget

{

Q_OBJECT

public:

ChildWindow(QWidget p = 0)

:QWidget(p)

{

QVBoxLayout l = new QVBoxLayout(this);

QPushButton btn = new QPushButton("btn", this);

l->addWidget(btn);

connect(btn, SIGNAL(clicked()), SLOT(ClickedBtn());

}

signals:

// 这个信号是发给父窗口的。

void ChildWindowEvent();

protected slots:

// 点击子窗口中按钮的slot

void ClickedBtn()

{

// 触发子窗口的信号给父窗口接收。

emit ChildWindowEvent();

}

}

// 父窗口

class ParentWindow : public QWidget

{

Q_OBJECT

public:

ParentWindow(QWidget p = 0)

:QWidget(p)

{

QVBoxLayout l = new QVBoxLayout(this);

w = new ChildWindow(this);

l->addWidget(w);

// 把子窗口的信号连接到父窗口来。

connect(w, SIGNAL(ChildWindowEvent()), SLOT(ChildWindowEventSlot());

}

protected:

ChildWindow w;

protected slots:

// 父窗口用于接收子窗口信号的slot。

void ChildWindowEventSlot()

{

//子窗口的按钮被点击了。

}

}

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/12184655.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-21
下一篇 2023-05-21

发表评论

登录后才能评论

评论列表(0条)

保存