2017-02-16 2 views
-2

В Qt5 я использовал этот метод для подключения сигналов, испускаемых в процессе с прорезью, но это не работает с Qt4Добавление пользовательских слотов в QT4

connect(process, &QProcess::readyReadStandardOutput, [=]{ 
ui->textBrowser->append(process->readAllStandardOutput()); 
}); 

Как предложил кто-то я пытался реализовать эту способ заменить исходную строку этим

connect(process, SIGNAL(readyReadStandardError()), receiver, SLOT(yourCustomSlot())); 

и прибавил в mainwindow.h

class MyReceiverClass { 

slots: 
    void yourCustomSlot() { 
     ui->textBrowser->append(process->readAllStandardOutput()); 
    } 
}; 

Но Ждут» t работал так, что получил ошибки объявления. Я не знаю, как правильно добавить пользовательский слот. Может ли кто-нибудь объяснить мне, как это сделать?

ответ

1

На самом деле это не slots, а private slots или public slots, основываясь на том, чего вы хотите достичь.

И вы использовали lambdas в первом примере, это поддержка Qt5, но не Qt4 (поскольку он использует старый стандарт C++).

И вам нужно иметь макросы Q_OBJECT, если вы хотите использовать механизм сигналов \ слотов в своем классе.

Так что ваш пример будет выглядеть (заголовочный файл):

#include <QObject> 
class MyReceiverClass : public QObject { 
Q_OBJECT 

public slots: 
    void yourCustomSlot() { 
     ui->textBrowser->append(process->readAllStandardOutput()); 
    } 
}; 

Подробнее о слотах: Qt4: Signals & Slots

Но выглядит, как вы обратитесь к ui и process элементов, которые не existsing в вашей реализации MyReceiverClass , Вы должны создать форму ui, содержащую элемент textBrowser, и инициализировать ее как gui для вашего виджета. Что-то вроде этого:

// widget.h

#ifndef WIDGET_H 
#define WIDGET_H 

#include <QWidget> 

namespace Ui { 
class Widget; 
} 

class QPushButton; 

class MyReceiverClass : public QWidget 
{ 
    Q_OBJECT 

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

public slots: 
    void yourCustomSlot() { 
       ui->textBrowser->append(process->readAllStandardOutput()); 
      } 

private: 
    Ui::Widget *ui; 
}; 

#endif // WIDGET_H 

// widget.cpp

#include "widget.h" 
#include "ui_widget.h" 

Widget::Widget(QWidget *parent) : 
    QWidget(parent), 
    ui(new Ui::Widget) 
{ 
    ui->setupUi(this); 
} 

Widget::~Widget() 
{ 
} 

Но вы должны действительно прочитать документы о том, как создавать виджеты и графический интерфейс на UI-формах в Qt, а также о слоте & сигнализирует о подключении, поскольку ваш вопрос показывает отсутствие понимания того, как этот фундаментальный механизм работает в Qt.

+0

Нет я не использую любой лямбда сейчас, и я пытался осуществить это так, но получил ошибку о том, что «щ» не был объявлен в этом «процессе» области видимости не был объявлен в этой области – Learner

+0

@Learner обновил свой предыдущий ответ. – Dmitriy

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