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() --------------------编程问答--------------------
show_preivew是定义在RegexpReplace类中的信号。 --------------------编程问答-------------------- 所以 m_pRegDlg 中 并没有 show_preivew()
--------------------编程问答-------------------- 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())));
--------------------编程问答--------------------
所以 m_pRegDlg 中 并没有 show_preivew()
是谁的 show_preivew()
show_preivew是定义在RegexpReplace类中的信号。
RegexpReplace *m_pRegDlg --------------------编程问答--------------------
connect 包含该类的成员函数是没有用的。。必须直接connect发出信号的对象。。
发出信号的对象就是RegexpReplace 啊,因为show_preivew()就是定义在RegexpReplace 中的信号,那发出信号的对象不是RegexpReplace 又是谁呢? --------------------编程问答--------------------
#ifndef _DEBUG
# define Q_VERIFY(x) (x)
#else
# define Q_VERIFY(x) Q_ASSERT(x)
#endif
然后把你的代码换成:
你说的这个就是ASSERT和VERIFY的区别,但是我的程序是debug模式,所不存在你说的问题,再说是因为connect这句断言失败,并不是这句没有执行。 --------------------编程问答-------------------- 如果看譱信息就可以了啊。很清楚的。 --------------------编程问答-------------------- 需要贴代码.. --------------------编程问答--------------------
需要贴代码..
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