2016-11-19 17 views
0

в моей программе Qt Мне нужно диалоговое окно для отправки сигнала в слот в главном окне. Я установил соединение правильно, насколько мне известно, и он не дает мне никаких ошибок во время компиляции или запуска, но по какой-то причине он просто ничего не делает, когда нажата кнопка, которая должна активировать сигнал. Почему это происходит?Сигналы и слоты, не работающие в qt

beastiary.h (MainWindow заголовок)

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 (MainWindow 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; 

dialog.cpp

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

я пропустить большую часть кода, просто не имеет ничего общего с реальным механизмом сигналов и слотов в игре здесь.

+0

Где вы выполняете диалог ? – krzaq

+0

'void Beastiary :: on_pushButton_clicked() { Диалог * ad = новый Диалог (это); ad-> show(); } 'В главном окне это кнопка, которая вызывает диалог – Nick

+0

См. Http://stackoverflow.com/q/26422154/1421332 – Silicomancer

ответ

2

Вы подключаете только экземпляр диалога, созданный локально, в конструкторе 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(); 
} 
+0

И также, находясь на нем, вы должны серьезно рассмотреть возможность использования явных подключений для этих сигналов пользовательского интерфейса , вместо того, чтобы полагаться на хрупкую функцию «connect by name» –

+0

@KevinKrammer, не могли бы вы расширить ее? – krzaq

+1

Имена слотов, такие как 'on_pushButton_clicked()', являются строчным намеком на то, что программа использует функции «соединить по имени», то есть есть элемент пользовательского интерфейса, называемый 'pushButton', который имеет сигнал' clicked() 'некоторый общий код в 'ui-> setupUi()' пытается найти подходящее имя слота для подключения. Это очень хрупкое, поскольку оно зависит от имен элементов, например. если эта кнопка будет переименована, слот перестанет работать. Выполнение явных вызовов 'connect()' в коде позволяет избежать этого, так как любое изменение имени виджета приведет к изменению имени переменной и сделает сборку сбоя подключения. –

 Смежные вопросы

  • Нет связанных вопросов^_^