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
Qt QEventLoop使用(信号和插槽)_Qt_Qt Signals_Qeventloop - Fatal编程技术网

Qt QEventLoop使用(信号和插槽)

Qt QEventLoop使用(信号和插槽),qt,qt-signals,qeventloop,Qt,Qt Signals,Qeventloop,我有一个应用程序,其中包含这样的行 emit WindowAdded(settings->WindowType);//!!!!!!!!!!!!!! MyWindow *widget = new MyWindow(0,settings,currentWindowIndex); 该信号改变了currentWindowIndex的值,但由于插槽的原因,它没有工作,它没有及时改变其值。有人建议我使用QEventLoop,但我不知道怎么做。请给我举个例子。 守则的另一部分: connect(ar

我有一个应用程序,其中包含这样的行

emit WindowAdded(settings->WindowType);//!!!!!!!!!!!!!!
MyWindow *widget = new MyWindow(0,settings,currentWindowIndex);
该信号改变了currentWindowIndex的值,但由于插槽的原因,它没有工作,它没有及时改变其值。有人建议我使用QEventLoop,但我不知道怎么做。请给我举个例子。 守则的另一部分:

 connect(area,SIGNAL(WindowAdded(QString)),this,SLOT(addWindowOnTab(QString)));


void WorkSpace::addWindowOnTab(QString title)
{
    qint32 i = TabsList->addTab(title);/////!!!!!!!!!!!!!!!!!!!!!!!!!
    emit addedWindowIndex(i);
    TabsList->setVisible(true);
}

connect(this,SIGNAL(addedWindowIndex(qint32)),area,SLOT(WindowIndexChanged(qint32)));

void MyMdiArea::WindowIndexChanged(qint32 index)
{
    currentWindowIndex=index;
}
我想这会有帮助的

MyMdArea是从QMdiArea继承的类,WorkSpace是一个QWidget,TabsList是一个QTabBar。 还有一个事实:我试图理解插槽的执行顺序,并在代码中添加了一些行:

QLabel *n= new QLabel("1");
n->show();
发出加窗信号后

在发出加法器信号后

更改currentWindowIndex的值后


这就是我看到的1233,它爆炸了我的大脑。也许我不明白什么?

信号不会改变值。至于插槽,您没有显示connect语句,也没有显示插槽定义等。目前无法给出准确的答案。这有点复杂,因为与插槽连接的信号会发出信号,会更改此值,如果需要,可以发布代码的所有部分,我们需要一个简单的代码来重现这个问题:sscce.org。目前,基于你的问题,可能会有太多的事情出错。我们对WindowAdded、MyWindow、您的插槽等一无所知。如果您没有明确使用Qt::QueuedConnection或多线程,插槽在您发出WindowAdded的位置同步执行。如果MyWindow是从QWidget派生的,那么您必须有一个QApplication实例在运行,而Application实例有一个事件循环在为您运行。。。所以我们需要更多的代码来弄清楚这里发生了什么
QLabel *n= new QLabel("2");
n->show();  
QLabel *n= new QLabel("3");
n->show();