特别是,我正在为QWizard实现一个QWizardPage(“MyWizardPage”),我想从我的QWizardPage :: nextId虚拟方法的覆盖中发出一个信号(“sigLog”)。
像这样:
class MyWizardPage
: public QWizardPage
{
Q_OBJECT
public:
MyWizardPage();
virtual int nextId() const;
Q_SIGNALS:
void sigLog(QString text);
};
int MyWizardPage::nextId() const
{
Q_EMIT sigLog("Something interesting happened");
}
但是当我尝试这个时,我在Q_EMIT行上得到以下编译错误:
错误1错误C2662:'MyWizardPage :: sigLog':无法将'this'指针从'const MyWizardPage'转换为'MyWizardPage&'
答案 0 :(得分:52)
可以通过在信号声明中添加“const”来从const方法发出信号,如下所示:
void sigLog(QString text) const;
我对此进行了测试,并且确实编译并运行,即使您实际上并没有将信号作为常规方法实现(即Qt可以使用它)。
答案 1 :(得分:2)
您可以尝试创建另一个类,将其声明为向导页面的朋友,并将向导添加为可变成员。之后你可以发出它的信号而不是向导的信号。
class ConstEmitter: public QObject
{
Q_OBJECT
...
friend class MyWizardPage;
Q_SIGNALS:
void sigLog(QString text);
};
class MyWizardPage
: public QWizardPage
{
Q_OBJECT
public:
MyWizardPage();
protected:
mutable CostEmitter m_emitter;
Q_SIGNALS:
void sigLog(QString text);
};
int MyWizardPage::nextId() const
{
Q_EMIT m_emitter.sigLog("Something interesting happened");
}
MyWizardPage::MyWizardPage()
{
connect(&m_emitter,SIGNAL(sigLog(QString)),this,SIGNAL(sigLog(QString)));
}
或者您可以使用
int MyWizardPage::nextId() const
{
Q_EMIT const_cast<MyWizardPage*>(this)->sigLog("Something interesting happened");
}
这是不推荐的方式,因为const_cast是一个hack,但它更短:)