关于QT的emit的一点疑问

zfqkjxy 2013-02-03 06:20:19
我是根据C++ QT4编程 那本书学的 一开始就用了emit

#ifndef FINDDIALOG_H
#define FINDDIALOG_H

#include <QtGui/QDialog>

class QCheckBox;
class QLabel;
class QLineEdit;
class QPushButton;

class FindDialog : public QDialog
{
Q_OBJECT

public:
FindDialog(QWidget *parent = 0);
~FindDialog();
signals:
void findNext(const QString &str, Qt::CaseSensitivity cs);
void findPrevious(const QString &str, Qt::CaseSensitivity cs);
private slots:
void findClicked();
void enableFindButton(const QString &text);
private:
QLabel *label;
QLineEdit *lineEdit;
QCheckBox *caseCheckBox;
QCheckBox *backwardCheckBox;
QPushButton *findButton;
QPushButton *closeButton;
};

#endif // FINDDIALOG_H

这是.h文件


#include <QtGui>
#include "finddialog.h"

FindDialog::FindDialog(QWidget *parent)
: QDialog(parent)
{
label = new QLabel(tr("Find &what:"));
lineEdit = new QLineEdit;
label->setBuddy(lineEdit);

caseCheckBox = new QCheckBox(tr("Match &case"));
backwardCheckBox = new QCheckBox(tr("Search &backford"));

findButton = new QPushButton(tr("&Find"));
findButton->setDefault(true);
findButton->setEnabled(false);

closeButton = new QPushButton(tr("Close"));

connect(lineEdit, SIGNAL(textChanged(const QString&)), this, SLOT(enableFindButton(const QString&)));
connect(findButton, SIGNAL(clicked()), this, SLOT(findClicked()));
connect(closeButton, SIGNAL(clicked()), this, SLOT(close()));

QHBoxLayout *topLeftLayout = new QHBoxLayout;
topLeftLayout->addWidget(label);
topLeftLayout->addWidget(lineEdit);

QVBoxLayout *leftLayout = new QVBoxLayout;
leftLayout->addLayout(topLeftLayout);
leftLayout->addWidget(caseCheckBox);
leftLayout->addWidget(backwardCheckBox);

QVBoxLayout *rightLayout = new QVBoxLayout;
rightLayout->addWidget(findButton);
rightLayout->addWidget(closeButton);
rightLayout->addStretch();

QHBoxLayout *mainLayout = new QHBoxLayout;
mainLayout->addLayout(leftLayout);
mainLayout->addLayout(rightLayout);
setLayout(mainLayout);

setWindowTitle(tr("Find"));
setFixedHeight(sizeHint().height());
}

FindDialog::~FindDialog()
{

}

void FindDialog::findClicked()
{
QString text = lineEdit->text();
Qt::CaseSensitivity cs = caseCheckBox->isChecked() ? Qt::CaseInsensitive : Qt::CaseSensitive;
if(backwardCheckBox->isChecked()) {
emit findPrevious(text, cs);
} else {
emit findNext(text, cs);
}
}

void FindDialog::enableFindButton(const QString &text)
{
findButton->setEnabled(!text.isEmpty());
}


这是对应的cpp文件,请问一下里面的emit有什么用,并没有声明connect将findprevious与其他槽连接成一块啊,那怎样触发事件呢,谢谢
...全文
12806 29 打赏 收藏 转发到动态 举报
写回复
用AI写文章
29 条回复
切换为时间正序
请发表友善的回复…
发表回复
Bumble_Bee 2015-05-10
  • 打赏
  • 举报
回复
引用 12 楼 kkvvll2 的回复:
[quote=引用 10 楼 szuzsq 的回复:] [quote=引用 8 楼 allencui0313 的回复:] 楼上的同学都解释的挺好的。 其实Qt是基于C++的。C++里面有emit关键字么? 没有。 那emit哪里来的? 从源码来看 #define emit emit什么都不是。 emit fun();其实就是写给程序员看的。。就相当于函数调用。 只是这个函数的实现是MOC实现的。
//======================================== 窃以为不仅是函数调用这样, 更好的理解,有点像windows的消息机制.... 在windows中,线程内往主线程生成的窗口发送消息时, 最后回调到消息处理函数,是在主线程的.... 如果是函数调用的话,在线程中发送消息时,就应该是在线程内消息处理函数.... 同样道理,在Qt中,线程内往主线程生成的东东,发送信号时, 回调到的槽,也是在主线程的.... [/quote] ============================== 连单线程里的机制都没讲通,就拿着多线程说事了。。。 emit findPrevious(text, cs); 中findPrevious(text, cs); 这个函数的声明在哪?实现又在哪?它的声明(信号)假如在A类,而实现的调用函数(槽)在B类,那编译器编译A类的时候难道调用个没有实现的findPrevious空函数,这肯定会报错。而qt正是用connect把这两个跨度的声明和实现用调用的方式联系了起来,我认为emit无非就是告诉编译器编译的时候findPrevious的定义实现在另一个地方,从connect方式中可以找到。如果没有emit的声明,编译器就做普通处理,因为findPrevious只有声明却没定义而报错[/quote] ============================== 我开始也像楼上那样想的,不过当我把findPrevious这个函数变一个名字后编译就会报错了,可见findPrevious并不像表面那么简单。具体是什么现在还不知道,正在学习中。。。
Aulang 2014-06-12
  • 打赏
  • 举报
回复
呵呵呵,我看这里,不理解就搜到这里了,看完书后,才发现书后面有解释的。
CaseSensitivity 2014-02-19
  • 打赏
  • 举报
回复
引用 15 楼 u010853437 的回复:
我觉得emit应该是向一个已定义的信号函数提供参数 目前,我们用的QT5.0.1在做扫雷游戏,其中难度设置这一块要求从对话框接收三个参数以改变游戏参数
这是个很好的例子。。。
polebear801 2013-11-23
  • 打赏
  • 举报
回复
是的,就是类似window的消息机制
引用 13 楼 kkvvll2 的回复:
这里做个编译就讲的很清楚了,http://www.qkevin.com/archives/89
这个确实比较清楚
aidanyang 2013-11-19
  • 打赏
  • 举报
回复
新手,我的认识,就是在此处发送信号,从而找到槽函数,进而进行操作
u011730237 2013-11-18
  • 打赏
  • 举报
回复
我也正好做这个例子 不懂emit是撒意思 库里面也是空声明 看了这贴后 就感觉云里雾里。
liyinhuicc 2013-11-14
  • 打赏
  • 举报
回复
谁给总结下,晕了
UnMovedMover 2013-11-05
  • 打赏
  • 举报
回复
http://blog.csdn.net/iceman_bing/article/details/5122521
  • 打赏
  • 举报
回复
信号这块还是迷糊,路过学习了。
ljylijinyuan 2013-10-23
  • 打赏
  • 举报
回复
各位大神给力,路过学习!
IreneBu 2013-07-24
  • 打赏
  • 举报
回复
我觉得就是一般的函数调用。
钟永炎 2013-07-15
  • 打赏
  • 举报
回复
厉害啊,还好让我看到了,学习掉先。
HyperMeta 2013-06-04
  • 打赏
  • 举报
回复
学习了
u010853437 2013-05-27
  • 打赏
  • 举报
回复


我觉得emit应该是向一个已定义的信号函数提供参数
目前,我们用的QT5.0.1在做扫雷游戏,其中难度设置这一块要求从对话框接收三个参数以改变游戏参数
getthings 2013-04-23
  • 打赏
  • 举报
回复
看着给位大神的回复,菜鸟看晕了。。。。
kvl 2013-03-28
  • 打赏
  • 举报
回复
引用 12 楼 kkvvll2 的回复:
[quote=引用 10 楼 szuzsq 的回复:] [quote=引用 8 楼 allencui0313 的回复:] 楼上的同学都解释的挺好的。 其实Qt是基于C++的。C++里面有emit关键字么? 没有。 那emit哪里来的? 从源码来看 #define emit emit什么都不是。 emit fun();其实就是写给程序员看的。。就相当于函数调用。 只是这个函数的实现是MOC实现的。
//======================================== 窃以为不仅是函数调用这样, 更好的理解,有点像windows的消息机制.... 在windows中,线程内往主线程生成的窗口发送消息时, 最后回调到消息处理函数,是在主线程的.... 如果是函数调用的话,在线程中发送消息时,就应该是在线程内消息处理函数.... 同样道理,在Qt中,线程内往主线程生成的东东,发送信号时, 回调到的槽,也是在主线程的.... [/quote] ============================== 连单线程里的机制都没讲通,就拿着多线程说事了。。。 emit findPrevious(text, cs); 中findPrevious(text, cs); 这个函数的声明在哪?实现又在哪?它的声明(信号)假如在A类,而实现的调用函数(槽)在B类,那编译器编译A类的时候难道调用个没有实现的findPrevious空函数,这肯定会报错。而qt正是用connect把这两个跨度的声明和实现用调用的方式联系了起来,我认为emit无非就是告诉编译器编译的时候findPrevious的定义实现在另一个地方,从connect方式中可以找到。如果没有emit的声明,编译器就做普通处理,因为findPrevious只有声明却没定义而报错[/quote] 这里做个编译就讲的很清楚了,http://www.qkevin.com/archives/89
kvl 2013-03-28
  • 打赏
  • 举报
回复
引用 10 楼 szuzsq 的回复:
[quote=引用 8 楼 allencui0313 的回复:] 楼上的同学都解释的挺好的。 其实Qt是基于C++的。C++里面有emit关键字么? 没有。 那emit哪里来的? 从源码来看 #define emit emit什么都不是。 emit fun();其实就是写给程序员看的。。就相当于函数调用。 只是这个函数的实现是MOC实现的。
//======================================== 窃以为不仅是函数调用这样, 更好的理解,有点像windows的消息机制.... 在windows中,线程内往主线程生成的窗口发送消息时, 最后回调到消息处理函数,是在主线程的.... 如果是函数调用的话,在线程中发送消息时,就应该是在线程内消息处理函数.... 同样道理,在Qt中,线程内往主线程生成的东东,发送信号时, 回调到的槽,也是在主线程的.... [/quote] ============================== 连单线程里的机制都没讲通,就拿着多线程说事了。。。 emit findPrevious(text, cs); 中findPrevious(text, cs); 这个函数的声明在哪?实现又在哪?它的声明(信号)假如在A类,而实现的调用函数(槽)在B类,那编译器编译A类的时候难道调用个没有实现的findPrevious空函数,这肯定会报错。而qt正是用connect把这两个跨度的声明和实现用调用的方式联系了起来,我认为emit无非就是告诉编译器编译的时候findPrevious的定义实现在另一个地方,从connect方式中可以找到。如果没有emit的声明,编译器就做普通处理,因为findPrevious只有声明却没定义而报错
szuzsq 2013-03-18
  • 打赏
  • 举报
回复
引用 8 楼 allencui0313 的回复:
楼上的同学都解释的挺好的。 其实Qt是基于C++的。C++里面有emit关键字么? 没有。 那emit哪里来的? 从源码来看 #define emit emit什么都不是。 emit fun();其实就是写给程序员看的。。就相当于函数调用。 只是这个函数的实现是MOC实现的。
//======================================== 窃以为不仅是函数调用这样, 更好的理解,有点像windows的消息机制.... 在windows中,线程内往主线程生成的窗口发送消息时, 最后回调到消息处理函数,是在主线程的.... 如果是函数调用的话,在线程中发送消息时,就应该是在线程内消息处理函数.... 同样道理,在Qt中,线程内往主线程生成的东东,发送信号时, 回调到的槽,也是在主线程的....
szuzsq 2013-03-18
  • 打赏
  • 举报
回复
有2个概念:1、发出信号;2、连接信号与槽 暂时我只知道在对象里面,发出自己的信号。而不知道怎么发出别人的信号。 例如:

class CSon {
  void send() {
    emit clicked(true); //这里,只是发出了CSon类型的对象的信号;
    //emit another->clicked(true); //不知道怎么样在CSon里面发出另外一个对象another的信号
  }
};

class CUi {
  void init() {
    //这一段的意思是,将CSon的信号clicked, 与CUi本身的槽onClicked连接起来.
    //因而只要在CSon里调用了emit clicked(true);发出信号,则会回调到CUi下面的函数onClicked这里来....
    QObject::connect(&son,SIGNAL(clicked(bool)), this, SLOT(onClicked(bool)));
  }
  void onClicked(bool state) {
  }
  CSon son;
};
  • 打赏
  • 举报
回复
楼上的同学都解释的挺好的。 其实Qt是基于C++的。C++里面有emit关键字么? 没有。 那emit哪里来的? 从源码来看 #define emit emit什么都不是。 emit fun();其实就是写给程序员看的。。就相当于函数调用。 只是这个函数的实现是MOC实现的。
加载更多回复(7)

16,216

社区成员

发帖
与我相关
我的任务
社区描述
Qt 是一个跨平台应用程序框架。通过使用 Qt,您可以一次性开发应用程序和用户界面,然后将其部署到多个桌面和嵌入式操作系统,而无需重复编写源代码。
社区管理员
  • Qt
  • 亭台六七座
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧