LINUX.ORG.RU

[чайник] C++

 


0

0

Доброго дня.

Пишу, пользуя Qt, программулину для общения с железом. clicked() кнопочки связан сигнал-слотом с функцией, которая посылает данные на порт.

По первости писать "чтобы работало" - всё в одном классе. Потом решил, что не стоит описание интерфейса с методами, работающими с железом, валить в кучу.

Вопрос: как структурно организовать программу, чтобы при событии(сигнале) я использовал методы другого класса? Не создавать же мне на каждый такой случай объект второго класса в теле нужного слота.

> Вопрос: как структурно организовать программу, чтобы при событии(сигнале) я использовал методы другого класса?

Хинт: к сигналам можно присоединить слоты произвольного класса, лишь 
бы типы аргументов соответствовали.

class MyUIClass : ..... ;

class MyNonUIClass : public QObject
{
  Q_OBJECT
public slots:
  какие-нужны-слоты
};

connect(myUIClassInstance, SIGNAL(mySignal()),
        myNonUIClassInstance, SLOT(mySlot()));

Begemoth ★★★★★
()
Ответ на: комментарий от Begemoth

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

Begemoth ★★★★★
()

Может я не понял вопроса.

Ведь мы без проблем связываем экземпляры разных классов. Типа:

connect(somebutton, SIGNAL(clicked()), mylabel , SLOT(clear()));

Sancho_s_rancho
()
Ответ на: комментарий от Begemoth

Млять! Про это я совсем забыл...Спасибо!

markevichus ★★★
() автор топика
Ответ на: комментарий от Begemoth

Вы отчасти правы. Просто следует больше практиковаться, вот и всё.

markevichus ★★★
() автор топика
Ответ на: комментарий от Begemoth

А ещё вопрос:

в каком месте я должен создать сигнал-слот, чтобы знать, какие ообъекты связывать? я делаю это в конструкторе MyUIClass . Но ведь в этот момент не может идти речи ни о каком myNonUIClassInstance.

markevichus ★★★
() автор топика
Ответ на: комментарий от markevichus

>в каком месте я должен создать сигнал-слот
Так что создать? сигнал, слот, или коннект между ними?

>..., чтобы знать, какие ообъекты связывать?

ЛОЛЧТО?

Кинь пример кода, а то уж больно сложно понять, что требуется)

yoghurt ★★★★★
()
Ответ на: комментарий от markevichus

Шаблон проектирования ModelControllerView. View у тебя MyUIClass, контроллер вместе с моделью - myNonUIClass. Можешь разделить controller и model. Связывать сигнал-слот надо там где будешь выставлять связь MC с V - можешь либо создать nonUI, затем передать его указатель в UI и там сделать связь, либо же создать оба объекта, а потом связать в C или MC - как тебе нравится. Разделять ли M и C или же их объединить - смотри по затратам на написание кода. Разве что слздавать nonUI из конструктора UI - плохая практика.

Spectr ★★★
()
Ответ на: комментарий от Spectr

> Разве что слздавать nonUI из конструктора UI - плохая практика.
Ну передать его в конструктор, разумеется!

svu ★★★★★
()
Ответ на: комментарий от yoghurt

>Так что создать? сигнал, слот, или коннект между ними?
имею в виду connect().

>Кинь пример кода, а то уж больно сложно понять, что требуется)
MyUIClass::MyUIClass(QWidget *parent) : 
QDialog(parent) {
...........
connect(
ui.pushButton,SIGNAL(clicked()),
<здесь должен быть экземпляр другого класса>,SLOT(myMethod(this->data1,this->data2))
);

}


toSpectr:
с сокращениями этими ничего не понял...

markevichus ★★★
() автор топика
Ответ на: комментарий от markevichus

connect(
ui.pushButton,SIGNAL(clicked()),
<здесь должен быть экземпляр другого класса>,SLOT(myMethod(this->data1,this->data2))
);

А в чем проблема?

MyUIClass::MyUIClass(MyNonUIClass* nonui, QWidget *parent) : 
......
connect(
ui.pushButton,SIGNAL(clicked()),
<здесь должен быть экземпляр другого класса>,SLOT(myMethod()));

А вот дополнительные параметры методу myMethod тут передать нельзя. 
Типы аргументов слота должна соответствовать типам аргументов сигнала 
(как вариант аргументов у слота может быть меньше, чем у сигнала).

Если вызывать надо методы с параметрами, то следует в классе 
MyUIClass завести поле типа MyNonUIClass*, проинициализировать его в
конструкторе и использовать в слотах.

class MyUIClass : public QWidget
{
  Q_OBJECT
public:
  MyUIClass(MyNonUIClass* nonui, QWidget* parent = 0);

private slots:
  void doSomething();

private:
  MyNonUIClass* nonui;
 ...
};

MyUIClass::MyUIClass(MyNonUIClass* nonui, QWidget* parent)
  : QWidget(parent), nonui(nonui)
{
  ...
  connect(aButton, SIGNAL(clicked()), this, SLOT(doSomething()));
}

void MyUIClass::doSomething()
{
  nonui->myMethod(data1->value(), data2->value());
}

Begemoth ★★★★★
()
Ответ на: комментарий от markevichus

Посмотри в доке на QT про "Model/View programming".

Если вкратце - то в твоем случае лучше всего сделать метод который будет делать связывание объектов с помощью connect(). У тебя и сигнал и слот - public; и там где создаешь объект модели - nonUIClass - там и делай связывание (т.е. connect) по уже существующим объектам GUI и nonUI.

т.е. - либо метод в MyUIClass который будет принимать nonUI указатель, и делать connect с ним, либо же в том месте где создаешь nonUI класс связывай их через connect.

ты можешь вызывать connect в любой момент пока у тебя оба объекта существуют, не обязательно это делать в конструкторах.

Spectr ★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.