Russian Qt Forum
Ноябрь 25, 2024, 02:16 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: 1 [2]   Вниз
  Печать  
Автор Тема: Как осуществить передачу нескольких параметров сигналом?  (Прочитано 10189 раз)
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #15 : Февраль 01, 2016, 14:28 »

QString достаточно умный, чтобы не по значению передаваться Улыбающийся (где-то читал)
А ну как оторвут от маминой Qt сиси? (тут говорят мобильные платформы и все такое  Улыбающийся)
Записан
Bepec
Гость
« Ответ #16 : Февраль 01, 2016, 14:36 »

Таки да, QString умён да и в передачи по значению нет ничего плохого. Ну разве что вы плисины программируете Веселый
Записан
gil9red
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 1805



Просмотр профиля WWW
« Ответ #17 : Февраль 01, 2016, 15:19 »

QString достаточно умный, чтобы не по значению передаваться Улыбающийся (где-то читал)
А ну как оторвут от маминой Qt сиси? (тут говорят мобильные платформы и все такое  Улыбающийся)

С++/qt и на мобилки собирается Улыбающийся
Да и там другие языки, в той же яве объекты передается по ссылке и только по ссылке, к простым типам это не относится, на то они и простые Улыбающийся
Записан

palya
Гость
« Ответ #18 : Февраль 02, 2016, 09:20 »

Пробовал, но понимания не хватает. Выложил исходный код примера и окончательный. Прошу помочь, если не сложно.

.cpp
Код:
#include <QtWidgets>
#include "counter.h"

void Counter::setValue(const QString& value)
{
    QWidget* wgt2 = new QWidget;
    Counter* ptxt2 = new Counter;
    QVBoxLayout* pvbxLayout2 = new QVBoxLayout;
    pvbxLayout2->addWidget(ptxt2);
    wgt2->setLayout(pvbxLayout2);
    wgt2->setAttribute(Qt::WA_ShowWithoutActivating);
    wgt2->setAttribute(Qt::WA_DeleteOnClose);
    wgt2->show();
}

int main(int argc, char** argv)
{
    QApplication app(argc, argv);
    QWidget* wgt = new QWidget;
    Counter* ptxt = new Counter;

    QObject::connect(ptxt, SIGNAL(textChanged(const QString&)),
    ptxt, SLOT(setValue(const QString&)));

    QVBoxLayout* pvbxLayout = new QVBoxLayout;
    pvbxLayout->addWidget(ptxt);
    wgt->setLayout(pvbxLayout);
    wgt->setWindowFlags(wgt->windowFlags() | Qt::WindowStaysOnTopHint);
    wgt->setAttribute(Qt::WA_DeleteOnClose);
    wgt->show();
    int x = wgt->x();
    int y = wgt->y();
    return app.exec();
}
.h
Код:
#ifndef COUNTER_H
#define COUNTER_H
#include <QObject>
#include <QtWidgets>

class Counter : public QLineEdit
{
    Q_OBJECT

public slots:
    void setValue(const QString&);

};
#endif

После безуспешных попыток:
.cpp
Код:
#include <QtWidgets>
#include "counter.h"

void Counter::setValue(const QString& value)
{
    emit myTextChanged(const &QString value, int& x, int& y);
}
void Counter::setValue2(const QString& value, int&, int&)
{
QWidget* wgt2 = new QWidget;
Counter* ptxt2 = new Counter;
QVBoxLayout* pvbxLayout2 = new QVBoxLayout;
pvbxLayout2->addWidget(ptxt2);
wgt2->setLayout(pvbxLayout2);
wgt2->setAttribute(Qt::WA_ShowWithoutActivating);
wgt2->setAttribute(Qt::WA_DeleteOnClose);
wgt2->move(x,y);
wgt2->show();
}

int main(int argc, char** argv)
{
    QApplication app(argc, argv);
    QWidget* wgt = new QWidget;
    Counter* ptxt = new Counter;

    QObject::connect(ptxt, SIGNAL(textChanged(const QString&)),
    ptxt, SLOT(setValue(const QString&)));
    QObject::connect(ptxt, SIGNAL(myTextChanged(const QString&, int&, int&)),
    ptxt, SLOT(setValue2(const QString&, int&, int&)));

    QVBoxLayout* pvbxLayout = new QVBoxLayout;
    pvbxLayout->addWidget(ptxt);
    wgt->setLayout(pvbxLayout);
    wgt->setWindowFlags(wgt->windowFlags() | Qt::WindowStaysOnTopHint);
    wgt->setAttribute(Qt::WA_DeleteOnClose);
    wgt->show();
    int x = wgt->x();
    int y = wgt->y();
    return app.exec();
}
.h
Код:
#ifndef COUNTER_H
#define COUNTER_H
#include <QObject>
#include <QtWidgets>

class Counter : public QLineEdit
{
    Q_OBJECT

public slots:
    void setValue(const QString&);
    void setValue2(const QString&, int&, int&);
signals:
    void myTextChanged(const QString&, int&, int&);

};
#endif
Записан
Bepec
Гость
« Ответ #19 : Февраль 02, 2016, 09:29 »

Мдамс.  И оно у вас компилируется?
Записан
palya
Гость
« Ответ #20 : Февраль 02, 2016, 09:31 »

Мдамс.  И оно у вас компилируется?
Нет, конечно. Это я, так сказать, изобразил ход мыслей.
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #21 : Февраль 02, 2016, 10:08 »

То есть в слоте textChanged нужно знать x и y родительского окна? Тогда так
Код
C++ (Qt)
void Counter::textChanged( const QString & )
{
int x = this->window()->x():
int y = this->window()->y():
...
}
Записан
palya
Гость
« Ответ #22 : Февраль 02, 2016, 10:20 »

То есть в слоте textChanged нужно знать x и y родительского окна? Тогда так
Код
C++ (Qt)
void Counter::textChanged( const QString & )
{
int x = this->window()->x():
int y = this->window()->y():
...
}
Спасибо, работает. Только я так и не понял всё вышеизложенное про сигнал от слота и extern, который я до этого нигде не встречал и не понял, как в данной ситуации я смог бы им воспользоваться.
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #23 : Февраль 02, 2016, 10:36 »

Спасибо, работает. Только я так и не понял всё вышеизложенное про сигнал от слота и extern, который я до этого нигде не встречал и не понял, как в данной ситуации я смог бы им воспользоваться.
Ну extern вообще-то не лучшее решение, но его никто не отменял. Вот Вы сказали нужна переменная из main
Код
C++ (Qt)
// файл main.cpp
int theX, theY;  // объявляете нужные переменные глобальными
 
void main( ..)
{
 ...
 theX = MyCalcX(...);   // вычисляете значения
 theY = MyCalcY(...);
 ...
}
Здесь уже theX и theY средствами Qt не получить. Но можно так
Код
C++ (Qt)
// файл Counter.cpp
 
extern int theX;  // или объявить их в Counter.h или любом хедере видимом отсюда
extern int theY;  
 
void Counter::textChanged( const QString & )
{
...
 

Записан
palya
Гость
« Ответ #24 : Февраль 02, 2016, 10:47 »

Но тут, я так понимаю, определение слота, где проводятся операции над аргументами, переданными сигналом, должно быть реализовано в том же файле. А не так, как у меня - объявление в .h, а определение в main.cpp. Я правильно понимаю?
И нужен ли тогда дополнительный конструктор?
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #25 : Февраль 02, 2016, 11:00 »

Но тут, я так понимаю, определение слота, где проводятся операции над аргументами, переданными сигналом, должно быть реализовано в том же файле. А не так, как у меня - объявление в .h, а определение в main.cpp. Я правильно понимаю?
И нужен ли тогда дополнительный конструктор?
Доступ к переменным из др файлов никак не связан с сигналами/слотами. Ведь theX и theY не их аргументы. Часто в таких случаях говорят типа
Цитировать
Возможно лучше отложить изучение Qt до тех пор пока будут твердые базовые знания в C++
Это не очень приятно слышать (да и эффект таких советов обычно как об стенку горох) - но ничего другого просто нет.
Записан
Страниц: 1 [2]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.132 секунд. Запросов: 23.