c++ - 信号和插槽在 qt 中不起作用

标签 c++ qt user-interface signals-slots qt-signals

在我的 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);
    }

dialog.h

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;

对话框.cpp

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

我确实省略了大部分代码,这些代码与此处实际使用的信号和槽机制无关。

最佳答案

您只是连接您在 Bestiary 的构造函数中本地创建的对话框实例,它在构造函数完成时超出范围。

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();
}

关于c++ - 信号和插槽在 qt 中不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40698543/

相关文章:

Java 用户界面框架?

C++ 链接器错误 : undefined reference to a static function

c++ - 如何将 MATLAB 图像处理库内置函数转换为 matlab coder 代码生成不支持的 c++?

c++ - 输出总是产生 0

c++ - 智能指针构造函数错误

c++ - 一种制作简单游戏GUI的方法

c++ - 新建 Win32 应用程序向导为空白

c++ - 为什么设计器生成的嵌入为 "Aggregation"的 UI 类无法实现自定义插槽?

c++ - 将 Qt 连接到数据库

Delphi 用标准 Windows GUI 窗口打开文件