QT5 Slot未在子类中调用

时间:2014-12-09 12:50:34

标签: c++ qt signals-slots

我有一个超类BackgroundWorkerWithWaitDialog来管理一个WaitDialog,它实现了一个进度条框,其中包含" abort"按钮。它在QThread中用作QObject。

我的目的是从BackgroundWorker派生任何后台任务,并仅实现execute()命令,轮询aborted标志以阻止它。

BackgroundWorkerWithWaitDialog派生自BackgroundWorker,它是一个QObject,所有类都是Q_OBJECT,工人类能够使用信号和插槽更新gui。此通信(Worker to Gui Object)正常工作。

问题在于虽然WaitDialog响应按钮点击,但是{Wait}信号是从WaitDialog发出的,但是BackGroundWorker没有接收到。{1}}信号。 (Gui - >工人)

aborted()

...

class WaitDialog : public QDialog
{
    Q_OBJECT

public:
    explicit WaitDialog(QWidget *parent = 0);
    ~WaitDialog();

public slots:
    void setText(QString text);
    void setProgress(bool shown, int max);
    void enableAbort(bool enable);
    void setProgression (int level);

signals:
    void aborted();

private slots:
    void on_cmdAbort_clicked();

private:
    Ui::WaitDialog *ui;

};


void WaitDialog::on_cmdAbort_clicked()
{
    qDebug() << "ABORT";
    emit aborted();
}

...

/// BackgroundWorker is QObject-derived.
class BackgroundWorkerWithWaitDialog : public BackgroundWorker
{
    Q_OBJECT
public:
    explicit BackgroundWorkerWithWaitDialog(MainWindow *main, WaitDialog *dialog);
...
public slots:
    virtual void abortIssued();

我有什么遗失的吗?我暂时用听众模式解决了这个问题,但坦率地说,我不喜欢这种混合修复。

为什么没有调用abortIssued槽?

提前致谢。


总结一下:

  • BackgroundWorkerWithWaitDialog(BWWWD)派生自继承自QObject的BackgroundWorker
  • BackgroundWorkerWithWaitDialog在构造函数中接收从QDialog派生的WaitDialog(WD)
  • 构造函数中的BWWWD connect()s带有abortIssued()槽的waitDialog aborted()信号
  • WD发出信号,但abortIssued不被称为
  • BWWWD在单独的QThread
  • 中执行

值得一提的是BWWWD类是由其他SpecificWorker类派生的,这些类实现了使用aborted()函数来中断处理的特定函数。

1 个答案:

答案 0 :(得分:0)

你的问题是:

  

我有一个超类BackgroundWorker,它管理一个WaitDialog,它实现了一个带有&#34; abort&#34;的进度条框。按钮。

BackgroundWorkerWithWaitDialog构造函数中,您没有将dialog传递给BackgroundWorker的构造函数,在设置时也不使用BackgroundWorker成员变量你的联系。

您的问题open语句错误,或者您正在连接到从未使用过的对话框。