Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 静态法QT信号_C++_Qt_Callback_Signals Slots - Fatal编程技术网

C++ 静态法QT信号

C++ 静态法QT信号,c++,qt,callback,signals-slots,C++,Qt,Callback,Signals Slots,我需要从静态回调函数发送一个信号。我做了以下工作: h .cpp 回调函数的内部: getInstance()->emitSignal(); 在代码中的某个地方: connect(MainWindow::getInstance(), SIGNAL(mysignal()), this, SLOT(print())); 但是slot print()没有执行。并且没有打印错误。我哪里错了?您确定信号已连接到插槽吗 为了避免输入错误,您可以使用以下语法(只要您不使信号/插槽过载,您就可以):

我需要从静态回调函数发送一个信号。我做了以下工作:

h

.cpp

回调函数的内部:

getInstance()->emitSignal();
在代码中的某个地方:

connect(MainWindow::getInstance(), SIGNAL(mysignal()), this, SLOT(print()));

但是slot print()没有执行。并且没有打印错误。我哪里错了?

您确定信号已连接到插槽吗

为了避免输入错误,您可以使用以下语法(只要您不使信号/插槽过载,您就可以):

另一个提示/样式指南:将你的信号命名为
signal\u mySignal
,将插槽命名为
slot\u print
,以避免打字错误,并将事情弄清楚


您还可以调用
this->dumpObjectInfo()(当然是在连接之后),然后查看输出

您确定信号已连接到插槽吗

为了避免输入错误,您可以使用以下语法(只要您不使信号/插槽过载,您就可以):

另一个提示/样式指南:将你的信号命名为
signal\u mySignal
,将插槽命名为
slot\u print
,以避免打字错误,并将事情弄清楚


您还可以调用
this->dumpObjectInfo()从主窗口的某个地方(当然是在连接之后)查看输出

回调使用
getInstance()
,因此如果还不存在小部件,肯定可以创建一个新的小部件。然后是您对执行回调的代码的理解程度。如果在建立连接之前进行回调,则不会调用插槽。这可能是你的问题。在没有实例的情况下调用回调是无效的,您应该断言是这样的

很可能,您不需要动态创建主窗口的实例。你可能面临一个XY问题,你认为你需要做些什么,但是你投入了太多的精力在一个解决方案上,而这个解决方案不起作用,以至于你看不到你试图解决的更大的问题。请清楚地公开您的应用程序到底是什么-为什么要动态创建窗口

也没有必要创建一个转发到信号的方法,除非您确实需要该信号是私有的。我怀疑你会这样做——不要把它当作隐私

下面的代码表明,如果正确执行,您尝试执行的操作肯定有效

// https://github.com/KubaO/stackoverflown/tree/master/questions/static-signal-48540601
#include <QtCore>

class Main : public QObject {
   Q_OBJECT
   static Main * m_instance;
public:
   Main(QObject * parent = {}) : QObject(parent) {
      Q_ASSERT(! hasInstance());
      m_instance = this;
   }
   static Main * instance() {
      if (! m_instance) m_instance = new Main;
      return m_instance;
   }
   static bool hasInstance() { return m_instance; }
   Q_SIGNAL void theSignal();
};

Main * Main::m_instance;

void callback() {
   Q_ASSERT(Main::hasInstance());
   // If the instance didn't exist here, nothing can receive the signal.
   Main::instance()->theSignal();
}

int main()
{
   int slotCalls = {};
   Main object;
   QObject::connect(&object, &Main::theSignal, [&]{ slotCalls ++; });
   Q_ASSERT(slotCalls == 0);
   callback();
   Q_ASSERT(slotCalls == 1);
}

#include "main.moc"
//https://github.com/KubaO/stackoverflown/tree/master/questions/static-signal-48540601
#包括
主类:公共QObject{
Q_对象
静态Main*m_实例;
公众:
主(QObject*parent={}):QObject(parent){
Q_断言(!hasInstance());
m_实例=此;
}
静态Main*实例(){
如果(!m_instance)m_instance=new Main;
返回m_实例;
}
静态bool hasInstance(){return m_instance;}
Q_信号无效信号();
};
Main*Main::m_实例;
void callback(){
Q_断言(Main::hasInstance());
//如果此处不存在该实例,则任何东西都无法接收该信号。
Main::instance()->theSignal();
}
int main()
{
int slotCalls={};
主要对象;
QObject::connect(&object,&Main::theSignal,[&]{slotCalls++;});
Q_断言(slotCalls==0);
回调();
Q_断言(slotCalls==1);
}
#包括“main.moc”

回调使用
getInstance()
,因此如果小部件还不存在,肯定可以创建一个新的小部件。然后是您对执行回调的代码的理解程度。如果在建立连接之前进行回调,则不会调用插槽。这可能是你的问题。在没有实例的情况下调用回调是无效的,您应该断言是这样的

很可能,您不需要动态创建主窗口的实例。你可能面临一个XY问题,你认为你需要做些什么,但是你投入了太多的精力在一个解决方案上,而这个解决方案不起作用,以至于你看不到你试图解决的更大的问题。请清楚地公开您的应用程序到底是什么-为什么要动态创建窗口

也没有必要创建一个转发到信号的方法,除非您确实需要该信号是私有的。我怀疑你会这样做——不要把它当作隐私

下面的代码表明,如果正确执行,您尝试执行的操作肯定有效

// https://github.com/KubaO/stackoverflown/tree/master/questions/static-signal-48540601
#include <QtCore>

class Main : public QObject {
   Q_OBJECT
   static Main * m_instance;
public:
   Main(QObject * parent = {}) : QObject(parent) {
      Q_ASSERT(! hasInstance());
      m_instance = this;
   }
   static Main * instance() {
      if (! m_instance) m_instance = new Main;
      return m_instance;
   }
   static bool hasInstance() { return m_instance; }
   Q_SIGNAL void theSignal();
};

Main * Main::m_instance;

void callback() {
   Q_ASSERT(Main::hasInstance());
   // If the instance didn't exist here, nothing can receive the signal.
   Main::instance()->theSignal();
}

int main()
{
   int slotCalls = {};
   Main object;
   QObject::connect(&object, &Main::theSignal, [&]{ slotCalls ++; });
   Q_ASSERT(slotCalls == 0);
   callback();
   Q_ASSERT(slotCalls == 1);
}

#include "main.moc"
//https://github.com/KubaO/stackoverflown/tree/master/questions/static-signal-48540601
#包括
主类:公共QObject{
Q_对象
静态Main*m_实例;
公众:
主(QObject*parent={}):QObject(parent){
Q_断言(!hasInstance());
m_实例=此;
}
静态Main*实例(){
如果(!m_instance)m_instance=new Main;
返回m_实例;
}
静态bool hasInstance(){return m_instance;}
Q_信号无效信号();
};
Main*Main::m_实例;
void callback(){
Q_断言(Main::hasInstance());
//如果此处不存在该实例,则任何东西都无法接收该信号。
Main::instance()->theSignal();
}
int main()
{
int slotCalls={};
主要对象;
QObject::connect(&object,&Main::theSignal,[&]{slotCalls++;});
Q_断言(slotCalls==0);
回调();
Q_断言(slotCalls==1);
}
#包括“main.moc”

conmnect调用成功了吗?@MANN66,我想它没有成功,因为插槽没有执行。我想,不要猜测,测试连接的结果!如果print是MainWindow::print:为什么对信号部分使用MainWindow::getInstance(),而对connect中的插槽部分使用MainWindow::getInstance()?conmnect调用成功了吗?@manni66,我想它没有成功,因为插槽没有执行我想没有,测试connect的结果!如果print是MainWindow::print:为什么对信号部分使用MainWindow::getInstance(),而对connect中的插槽部分使用MainWindow::getInstance()?1。您可以发布dumpObjectInfo()的结果吗?2.连接行是否符合我建议的语法且没有错误?1。你能把这封信寄出去吗
connect(MainWindow::getInstance(), &MainWindow::mysignal, this, &MainWindow::print);
// https://github.com/KubaO/stackoverflown/tree/master/questions/static-signal-48540601
#include <QtCore>

class Main : public QObject {
   Q_OBJECT
   static Main * m_instance;
public:
   Main(QObject * parent = {}) : QObject(parent) {
      Q_ASSERT(! hasInstance());
      m_instance = this;
   }
   static Main * instance() {
      if (! m_instance) m_instance = new Main;
      return m_instance;
   }
   static bool hasInstance() { return m_instance; }
   Q_SIGNAL void theSignal();
};

Main * Main::m_instance;

void callback() {
   Q_ASSERT(Main::hasInstance());
   // If the instance didn't exist here, nothing can receive the signal.
   Main::instance()->theSignal();
}

int main()
{
   int slotCalls = {};
   Main object;
   QObject::connect(&object, &Main::theSignal, [&]{ slotCalls ++; });
   Q_ASSERT(slotCalls == 0);
   callback();
   Q_ASSERT(slotCalls == 1);
}

#include "main.moc"