发出 Qt 信号但从未调用过插槽

Posted

技术标签:

【中文标题】发出 Qt 信号但从未调用过插槽【英文标题】:Qt signal emitted but slot never called 【发布时间】:2020-04-05 23:58:03 【问题描述】:

我想使用插槽和信号连接两个对象(播放器和 DownloadWebm),但是发生了一些奇怪的事情。 这是我的代码:

  LogInWindow *log_in=new LogInWindow(cstr,centerX,centerY,start_byte,end_byte);
    QWidget::connect(log_in,SIGNAL(editingFinished()),&loop,SLOT(quit()));

    loop.exec();//stop executing bellow code till user input a movie id

    DownloadWebm *download_webm=nullptr;//download_webm is initialized in myThread constructor

    MyThread *DownloadWebm_Thread = new  MyThread(download_webm,cstr,start_byte,end_byte);

    DownloadWebm_Thread->start();//start the thread

    LinuxWebmPlayer *player = new LinuxWebmPlayer("video.webm",0);


    while(download_webm == nullptr)//wait till download_webm is initialized

    qRegisterMetaType<Video_Bytes_Package>("Video_Bytes_Package");
    qRegisterMetaType<Info>("Info");

    QObject::connect(download_webm,SIGNAL(send_video_info(Info)),player,SLOT(set_video_info(Info)));
    QObject::connect(download_webm,SIGNAL(send_packege(Video_Bytes_Package)),player,SLOT(add_packeges(Video_Bytes_Package)));
    QObject::connect(download_webm,SIGNAL(send_finish_downloading(bool)),player,SLOT(video_is_commplet()));
    QObject::connect(download_webm,SIGNAL(send_one_cluster_recived()),player,SLOT(calculate_frames()));

  const bool connected =  QObject::connect(player,SIGNAL(yes()),download_webm,SLOT(slot()));
  emit player->yes();
  qDebug() << "Connection established?" << connected;//return true
  Q_ASSERT(connected);

当我将 download_webm 连接到播放器时,插槽会接收到 download_webm 发出的信号 但是当我尝试将播放器连接到 download_webm 时,连接成功,发出信号但从不调用 download_webm 的插槽。

DownloadWebm 正在另一个线程中运行。

这是我在 downloadwebm 中的信号声明:

 class DownloadWebm : public QObject


    Q_OBJECT

public:
    DownloadWebm();
    DownloadWebm(char *link,const char *app_path,long x,long y);
    void start();
public slots:
    void slot();
    void first_package_analyzed(int,long);

 private:
  ................
  ................ 

  signals:
   void send_packege(Video_Bytes_Package package);
   void send_video_info(Info info);
   void send_finish_downloading(bool) ;

和播放器标题:

   class LinuxWebmPlayer : public QMainWindow

    Q_OBJECT
public:

 LinuxWebmPlayer(char* argv,int pos);

signals:
    void send_cluster_size_frames(long);
    void yes();


public slots:
   void add_packeges(Video_Bytes_Package);
   void set_video_info(Info);

【问题讨论】:

您的 DownloadWebm 所在的线程是否正在运行事件循环。好像不是这样的。 是的,你是对的,我在我的对象中使用了一个无限循环,但这会导致我的对象冻结,经过更多研究我发现我可以使用 QEventLoop 来避免阻塞对象,坦克!跨度> 【参考方案1】:

我发现了问题,我的 DownloadWebm 对象中没有事件循环,因此当发出信号时,对象已完成执行。

【讨论】:

以上是关于发出 Qt 信号但从未调用过插槽的主要内容,如果未能解决你的问题,请参考以下文章

在Qt中通过信号和插槽系统传递变量[关闭]

QTableView点击信号从未发出?

跟随发出的信号到其连接的插槽?

Qt 插槽同时断开连接并从不同线程调用

Qt C++ 信号和槽没有触发

小部件关闭后 Qt 发出信号