簡體   English   中英

信號和插槽在QT中不起作用

[英]Signals and slots not working in qt

在我的Qt程序中,我需要對話框將信號發送到主窗口中的插槽。 據我所知,我已經正確設置了連接,並且在編譯或運行時不會給我任何錯誤,但是由於某種原因,當單擊應該激活信號的按鈕時,它只是不執行任何操作。 為什么會這樣呢?

beastiary.h (主窗口頭)

namespace Ui {
class Beastiary;
}

class Beastiary : public QMainWindow
{
    Q_OBJECT

public:

    explicit Beastiary(QWidget *parent = 0);

    Ui::Beastiary *ui;

    QStringList MyList;

    ~Beastiary();

public slots:
    void refresh();

private slots:

    void on_pushButton_clicked();

    void on_listWidget_itemClicked(QListWidgetItem);

    void on_pushButton_2_clicked();

    void on_pushButton_3_clicked();

beastiary.cpp (主窗口cpp文件)

Beastiary::Beastiary(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::Beastiary)
{
    ui->setupUi(this);
    Dialog  dialog;
    connect(&dialog, SIGNAL(gorefresh()),this, SLOT(refresh())) ;


    void Beastiary::refresh()
    {
      qDebug () << "recieved";
      ui->listWidget->clear();
      QString path = "C:/Program Files/Bargest/bin";
      QDir myPath(path);
      myPath.setFilter(QDir::Dirs | QDir::Files | QDir::NoDotAndDotDot);
      MyList = myPath.entryList();
      ui->listWidget->addItems(MyList);
    }

對話框

namespace Ui {
class Dialog;

}

class Dialog : public QDialog
{
    Q_OBJECT


public:

    explicit Dialog(QWidget *parent = 0);
    ~Dialog();


signals:
    void gorefresh();

private slots:
    void on_pushButton_done_clicked();

    void on_pushButton_cancel_clicked();

    void on_pushButton_clicked();

private:
    Ui::Dialog *ui;

dialog.cpp

void Dialog::on_pushButton_done_clicked()
{    
  emit gorefresh();
}

我確實省略了大部分代碼,這些代碼與這里發揮作用的實際信號和插槽機制無關。

您僅連接在Bestiary的構造函數中本地創建的對話框實例,該對話框實例在構造函數完成時會超出范圍。

connect是連接實例 ,而不是 這意味着您需要connect每個創建的對話框:

void Beastiary::on_pushButton_clicked() {
    Dialog* ad = new Dialog(this);
    connect(ad, SIGNAL(gorefresh()), this, SLOT(refresh()));
    ad->show();
}

同時,您應該認真考慮使用Qt 5隨附的類型安全的連接語法:

void Beastiary::on_pushButton_clicked() {
    Dialog* ad = new Dialog(this);
    connect(ad, &Dialog::gorefresh, this, &Bestiary::refresh));
    ad->show();
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM