当前位置:编程学习 > wap >>

Qt信号传递问题


如图,点击“预览”按钮,给箭头所指的控件发信号show_preivew。
按钮是在RegexpReplace 的Widget中,箭头所指的控件在主程序窗口中。

我在RegexpReplace类中按钮的clicked()的槽函数里面发射信号 emit show_preivew(),在主窗口中调用槽函数接收
connect(m_pRegDlg, SIGNAL(show_preivew()), this, SLOT(on_preivew()))

返回值总是false

但是如果我在RegexpReplace类中将按钮的clicked()信号与show_preivew()信号连接起来
connect(ui.pushButton, SIGNAL(clicked()), this, SIGNAL(show_preivew()));

这样在主程序中connect就是OK的,槽函数on_preview也可以响应,请问下这是为什么?第一种做法connect为什么会失败呢? qt connect 信号 槽 qt  connect  信号 槽 --------------------编程问答-------------------- 是谁的 show_preivew() --------------------编程问答--------------------
引用 1 楼 dext 的回复:
是谁的 show_preivew()

show_preivew是定义在RegexpReplace类中的信号。 --------------------编程问答-------------------- 所以 m_pRegDlg 中 并没有 show_preivew()

引用 2 楼 blueln 的回复:
Quote: 引用 1 楼 dext 的回复:

是谁的 show_preivew()

show_preivew是定义在RegexpReplace类中的信号。
--------------------编程问答-------------------- connect 包含该类的成员函数是没有用的。。必须直接connect发出信号的对象。。 --------------------编程问答-------------------- 楼上回答的都是些什么玩意 --------------------编程问答-------------------- m_pRegDlg 是在主窗口中创建的RegexpReplace类对象吧?
RegexpReplace *m_pRegDlg;
--------------------编程问答-------------------- #ifndef _DEBUG
# define Q_VERIFY(x) (x)
#else
# define Q_VERIFY(x) Q_ASSERT(x)
#endif

然后把你的代码换成: --------------------编程问答-------------------- Q_VERIFY (connect(m_pRegDlg, SIGNAL(show_preivew()), this, SLOT(on_preivew())));
--------------------编程问答--------------------
引用 3 楼 dext 的回复:
所以 m_pRegDlg 中 并没有 show_preivew()

Quote: 引用 2 楼 blueln 的回复:

Quote: 引用 1 楼 dext 的回复:

是谁的 show_preivew()

show_preivew是定义在RegexpReplace类中的信号。

RegexpReplace *m_pRegDlg --------------------编程问答--------------------
引用 4 楼 kfbyj 的回复:
connect 包含该类的成员函数是没有用的。。必须直接connect发出信号的对象。。


发出信号的对象就是RegexpReplace 啊,因为show_preivew()就是定义在RegexpReplace 中的信号,那发出信号的对象不是RegexpReplace 又是谁呢? --------------------编程问答--------------------
引用 7 楼 TearyWang 的回复:
#ifndef _DEBUG
# define Q_VERIFY(x) (x)
#else
# define Q_VERIFY(x) Q_ASSERT(x)
#endif

然后把你的代码换成:

你说的这个就是ASSERT和VERIFY的区别,但是我的程序是debug模式,所不存在你说的问题,再说是因为connect这句断言失败,并不是这句没有执行。 --------------------编程问答-------------------- 如果看譱信息就可以了啊。很清楚的。 --------------------编程问答-------------------- 需要贴代码.. --------------------编程问答--------------------
引用 13 楼 dext 的回复:
需要贴代码..


class RegexpReplace : public QWidget
{
Q_OBJECT

public:
RegexpReplace(QWidget *parent = 0);
~RegexpReplace();
QRegExp get_regPattern();
QString get_dstName();

private:

private slots:
void on_init();
void on_pushButton_clicked();

signals:
void show_preivew();

private:
Ui::RegexpReplace ui;
};


void RegexpReplace::on_pushButton_clicked()
{
emit show_preivew();
}


m_pRegDlg = new RegexpReplace;
QTabWidget* pTab = new QTabWidget;
pTab->addTab(m_pRegDlg, QIcon(tr(":/FlashRenamer/Resources/tab_regular.png")), QStringLiteral("正则替换"));
m_pVertiSpliter->addWidget(pTab);


Q_ASSERT(connect(m_pRegDlg, SIGNAL(show_preivew()), this, SLOT(on_regex_preivew())));


另外说明一点,我debug走的,emit是执行了的。 --------------------编程问答-------------------- --------------------编程问答-------------------- connect语句的执行必须在RegexpReplace实例化之后
补充:移动开发 ,  Qt
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,