Qt 信号发出但插槽从未调用
Qt signal emitted but slot never called
我想使用插槽和信号连接两个 object(播放器和 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) ;
和玩家 header :
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 对象中没有事件循环,所以当发出信号时,对象已完成执行。
我想使用插槽和信号连接两个 object(播放器和 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) ;
和玩家 header :
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 对象中没有事件循环,所以当发出信号时,对象已完成执行。