2015-05-23 3 views
-1

Я пытаюсь подключить сигнал от второго QMainWindow к главному окну. Он не говорит ничего о проблемном соединении при запуске программы, но он не работает. Я не очень хорошо знаком с C++ и Qt, поэтому, возможно, это просто.Сигнальный слот QT не принимается

Мой код состоит из Mainwindow, используемого как SCADA, с кнопками Start, Stop, On, off. Во втором qmainwindow я создал терминал, в котором вы можете вводить, запускать, останавливать ... Там я хотел бы передать сигнал на мой MainWindow, который отвечает за управление несколькими потоками и окнами. Проблема в том, что я не могу подключиться к своему слоту. Я представляю здесь простой обзор этих двух частей кода.

Терминал. ч

#ifndef TERMINAL__H 
#define TERMINAL__H 

#include <QMainWindow> 
#include <QTextEdit> 
#include <QLineEdit> 
#include <QObject> 

namespace Ui { 
class Terminal_; 
} 

class Terminal_ : public QMainWindow 
{ 
    Q_OBJECT 

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

signals: 
    void turnonPLC_terminal(); 

public slots: 
    void newline(); 

private: 
    Ui::Terminal_ *ui; 
    QTextEdit* mTerminal; 
    QLineEdit* mInput; 

}; 

#endif // TERMINAL__H 

mainwindow.h

#ifndef MAINWINDOW_H 
#define MAINWINDOW_H 

#include <QMainWindow> 

#include "terminal_.h" 
#include "terminal_help.h" 


namespace Ui { 
class MainWindow; 
} 

class MainWindow : public QMainWindow 
{ 
    Q_OBJECT 


public: 
    explicit MainWindow(QWidget *parent = 0); 
    ~MainWindow(); 
    Terminal_ *terminal; 


public slots: 
    void turnon_terminal(); 

private: 

    Ui::MainWindow *ui; 



}; 


#endif // MAINWINDOW_H 

mainwindow.cpp

#include "mainwindow.h" 
#include "ui_mainwindow.h" 
#include "terminal_.h" 

MainWindow::MainWindow(QWidget *parent) : 
    QMainWindow(parent), 
    ui(new Ui::MainWindow) 
{ 
    ui->setupUi(this); 
    terminal = new Terminal_(this); 
    connect(terminal, SIGNAL(turnonPLC_terminal()), this, SLOT(turnon_terminal())); 


} 

MainWindow::~MainWindow() 
{ 
    delete ui; 
} 

void MainWindow::turnon_terminal(){ 
    turnonPLC=1; 
} 

terminal_.cpp

#include "terminal_.h" 
#include "ui_terminal_.h" 

#include <QDockWidget> 
#include <QWidget> 
#include <QLineEdit> 

QString on=("on"); 

Terminal_::Terminal_(QWidget *parent) : 
    QMainWindow(parent), 
    ui(new Ui::Terminal_) 
{ 
    ui->setupUi(this); 
    mTerminal = new QTextEdit(); 
    setCentralWidget(mTerminal); 
    mInput = new QLineEdit(); 

    QDockWidget* qdw = new QDockWidget; 
    qdw->setWidget(mInput); 
    addDockWidget(Qt::BottomDockWidgetArea, qdw); 
    connect (mInput, SIGNAL(returnPressed()), 
      this, SLOT(newline())); 

} 

Terminal_::~Terminal_() 
{ 
    delete ui; 
} 


void Terminal_::newline(){ 
    QString command = mInput->text(); 
    if (command==on){ 
    emit turnonPLC_terminal(); 
} 
} 

Благодаря

+0

Является ли ваша переменная 'command == on' равной' on'? Хм, что же значит «на»? Уверен, что этот сигнал просто не испускается. Вы пытались отладить ваше приложение? –

+0

В связи с тем, что @VictorPolevoy сказал: вы берете 'QString' из элемента управления' QLineEdit', поэтому оператор 'if' не должен' if (command == "on") '? – Carlton

+0

Также вы подключаете сигнал от члена класса к слоту в том же классе; это звучало так, будто вы хотели подключить сигнал от одного класса к слоту в другом классе. – Carlton

ответ

1

Часть сигнальных слотов в коде работает отлично. (скомпилировано и протестировано с небольшими модификациями) После ввода «on» (не вкл., как указано в вопросе) Terminal_::newline() слот под названием, turnonPLC_terminal() уволен и, наконец, void MainWindow::turnon_terminal().

Однако некоторые мелкие детали заголовочный файл называется terminal_.h, а не Terminal.h turnonPLC не определен. терминал создается не отображаемым (без показов).

Я предполагаю, что есть несколько ошибок в малой логике. Попробуйте использовать отладчик или отслеживать цепочку ожидаемых вызовов с помощью qDebug.

+0

Извините, но эти небольшие ошибки в основном потому, что мой проект содержит 20 файлов для всех моих окон и потоков ... поэтому, уменьшая его, я забываю, как объявление здесь переменной turnonPLC, но для моего кода работает. И то же самое для терминала, который отображается хорошо. Я попытался изменить имя моей библиотеки, но все еще не работает ... У меня была эта проблема два дня, и я решил ее подпрыгнуть. Я передаю переменную из моего терминала_.cpp в другой поток, а оттуда посылаю сигнал. И я решил это, как 5 минут назад, это не идеально, но это работает. Большое спасибо ;) – landondonovan

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