Сигнал Qt испущен, но слот никогда не вызывается - PullRequest
0 голосов
/ 06 апреля 2020

Я хочу соединить два объекта (плеер и 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);

1 Ответ

0 голосов
/ 23 апреля 2020

Я нахожу проблему, у меня нет события l oop в моем объекте DownloadWebm, поэтому, когда сигнал испускается, объект завершает sh выполнение.

...