为啥我的数据不能在带有 SIGNAl/SLOT 的表格之间传输?

Posted

技术标签:

【中文标题】为啥我的数据不能在带有 SIGNAl/SLOT 的表格之间传输?【英文标题】:Why my data can not transfer between forms with SIGNAl/SLOT?为什么我的数据不能在带有 SIGNAl/SLOT 的表格之间传输? 【发布时间】:2016-06-18 04:45:58 【问题描述】:

我在 Qt 中有主窗口和 1 个对话框(在 Linux 操作系统中)。我想从主窗口发送一些东西到我的对话框。当用户按下菜单按钮时,单击我的按钮会发出信号。这是我在 main.cpp 中的代码:

MainWindow w;
MyDialog m;
//------------------------------
//this connection send key button press mood from MainWindow
QObject::connect(&w,SIGNAL(pressMood(QString)),
          &m,SLOT(getPressMood(QString)));
w.show();  

这是我的 mainwindos.h:

signals:
    void pressMood(QString mood) ;

主窗口.cpp:

void MainWindow::on_btnMenu_clicked()

    if(database->checkEmpty())
    
        menu mn;/*=new menu();*/
        mn.showFullScreen();
    
    else
    
       MyDialog *d=new MyDialog(this);

       d->show();
       d->raise();
       d->activateWindow();
emit pressMood("menu");
       if(d->Accepted>0)
       
           if(loginResult)
           
               menu *mn=new menu();
               mn->showFullScreen();
           
       
       else
           QMessageBox::warning(this, tr("Login failed"), "Sorry.Your authenticate is not valid.", QMessageBox::Ok);
    

//--------------------------------------------
void MainWindow::on_btnPassword_clicked()

    //emit sendID2(result);
    CardDialog *d=new CardDialog(this);
     emit pressMood("pass");
    d->show();
    d->raise();

    if(d->Accepted<=0)
        QMessageBox::warning(this, tr("Login failed"), "Sorry.Your authenticate is not valid.", QMessageBox::Ok);


我不使用dialog.exec(),因为我不需要显示模态。 MyDialog.h:

public slots:
    void getPressMood(QString mood);

和 MyDialog.cpp: //================================================= =

void MyDialog::getPressMood(QString mood)

    mood=mood;
   //ui->lblMood->setText(mood);;
   //ui->lblMood->hide();

void MyDialog::on_buttonBox_accepted()

    //QString mood=ui->lblMood->text();
    bool st=database->checkPassword(ui->txtID->text(),ui->txtPass->text(),"3");
    int id=(ui->txtID->text()).toInt();
    //this user is valid to go to menu page
    //s/he is admin
    if((st)&&
            mood=="menu" &&
            database->checkAdmin(id))
    
         .......
    

当我逐行跟踪我的代码时。发射信号有效,它以另一种形式将字符串数据发送到我的插槽,getpressedmood() 插槽也有效。但是当对话框显示时全局 var 情绪变为 NULL,我也决定将数据保存在标签中。在跟踪心情中,我看到字符串已发送,但当对话框显示标签变为默认值时。 我找不到错误。你能帮帮我吗?

【问题讨论】:

【参考方案1】:

解决了。 我的错误是在 main.cpp 中连接信号和插槽。答案是:

    MyDialog *d=new MyDialog(this);
//should connect here not in main.cpp
           QObject::connect(this,SIGNAL(pressMood(QString)),
                          d,SLOT(getPressMood(QString)));
           emit pressMood("menu");
           d->show();
           d->raise();
           d->activateWindow();

【讨论】:

以上是关于为啥我的数据不能在带有 SIGNAl/SLOT 的表格之间传输?的主要内容,如果未能解决你的问题,请参考以下文章

详解 Qt 线程间共享数据(使用signal/slot传递数据,线程间传递信号会立刻返回,但也可通过connect改变)

13:高级篇 - CTK 事件管理机制(signal/slot)

QT 中 关键字讲解(emit,signal,slot)

为啥我的带有@EmbeddedId 的实体不能在其对应的@Embeddable 类中使用LocalDateTime?

为啥我不能在 Python 中反序列化带有单引号的 JSON 字符串?

为啥我的带有 ^ 的 Emacs 正则表达式不能匹配行的开头?