Форум русскоязычного сообщества Ubuntu


Считаете, что Ubuntu недостаточно дружелюбна к новичкам?
Помогите создать новое Руководство для новичков!

Автор Тема: Проблемы с параметрами слота в Qt  (Прочитано 5157 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн S_F_H

  • Автор темы
  • Участник
  • *
  • Сообщений: 129
  • Да будет crossplatform!
    • Просмотр профиля
Проблемы с параметрами слота в Qt
« : 05 Апреля 2011, 04:36:58 »
Всем доброго дня. Изучая Qt столкнулся с такой вот проблемой: как передать слоту виджет?

делаю так: в файле заголовков(.h) описываю слот:
   
namespace Ui {
    class Lab1;
}

class Lab1 : public QWidget
{
    Q_OBJECT

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

[b]public slots:
    void changeTbText(QLineEdit &);[/b]

private:
    Ui::Lab1 *ui;
    void drawGraphic();

};


файл реализации(.cpp):



Lab1::Lab1(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::Lab1)
{
    ui->setupUi(this);
    QLineEdit *le = (ui->tbFadeTime);
   [b] connect(ui->sliderFadeTime, SIGNAL(valueChanged(int)), this, SLOT(changeTbText(&(ui->tbEdit))));[/b]
}

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

void Lab1::drawGraphic()
{

}

[b]void Lab1::changeTbText(QLineEdit &lineEdit)
{
    lineEdit.setText("123");
}[/b]

все при этом компилируется, однако отклика на сигнал нет, и IDE выдает:
Object::connect: No such slot Lab1::changeTbText(&(ui->tbFadeTime)) in ../Lab1/lab1.cpp:12
Object::connect:  (sender name:   'sliderFadeTime')
Object::connect:  (receiver name: 'Lab1')

пожалуйста, подскажите, что я не так сделал. Заранее благодарю

работаю с Qt в Qt Creator.

Оффлайн ChaosWarrior

  • Активист
  • *
  • Сообщений: 461
  • d(-_-)b
    • Просмотр профиля
Re: Проблемы с параметрами слота в Qt
« Ответ #1 : 05 Апреля 2011, 08:19:57 »
Хрень какая-то написана. Что вы вообще хотели сделать?

Мне кажется, вы пытаетесь какое-то непотребство совершить, но не пойму какое, поэтому все файлы проекта сюда, пожалуйста, а то тяжко еще и пытаться угадать, где это происходит.

Кто такой sliderFadeTime и где он объявлен? Я подозреваю, что это поле ввода типа LineEdit. У него есть нужный вам сигнал. sliderFadeTime по-любому живет на какой-то форме. Форме добавить слот (кстати, меня бесит, что QtCreator его в код сам не добавляет), принимающий QString и связать с сигналом.
Открытый код и его подержка — это лучшая реклама Windows.

Оффлайн S_F_H

  • Автор темы
  • Участник
  • *
  • Сообщений: 129
  • Да будет crossplatform!
    • Просмотр профиля
Re: Проблемы с параметрами слота в Qt
« Ответ #2 : 05 Апреля 2011, 11:05:23 »
по сути требуется сделать отображение значения ползунка sliderFadeTime (QSlider), в поле tbEdit (QLineEdit). так вот, таких ползунков и полей может быть около дву сотен, и надо как-то сделать слот, который можно было бы присоединить к сигналам этих ползунков. вот как-то так.


да, вот ссылка на архив с файлами проекта
http://zalil.ru/30801108
« Последнее редактирование: 05 Апреля 2011, 11:07:34 от S_F_H »

Оффлайн Белый пони

  • Любитель
  • *
  • Сообщений: 63
    • Просмотр профиля
Re: Проблемы с параметрами слота в Qt
« Ответ #3 : 05 Апреля 2011, 13:37:40 »
Всем доброго дня. Изучая Qt столкнулся с такой вот проблемой: как передать слоту виджет?

делаю так: в файле заголовков(.h) описываю слот:
   
все при этом компилируется, однако отклика на сигнал нет, и IDE выдает:
Object::connect: No such slot Lab1::changeTbText(&(ui->tbFadeTime)) in ../Lab1/lab1.cpp:12
Object::connect:  (sender name:   'sliderFadeTime')
Object::connect:  (receiver name: 'Lab1')

пожалуйста, подскажите, что я не так сделал. Заранее благодарю

работаю с Qt в Qt Creator.

У тебя сигнал передаёт значение типа int, а слот принимает тип QLineEdit & . Поэтому и не работает. Надо сделать слот, который принимает int, преобразует его в QString и вставляет в лайнэдит.  А на случай двух сотен слайдеров можно, как вариант сделать на всех один сигнал, в котором будет передаваться массив значений для каждого из них. Если надо соединить их именно отдельно, то можно слайдеры и текстэдиты объединить в масиив (или QList) и потом в цикле их пересоединять. Хотя я так не пробовал.

Оффлайн S_F_H

  • Автор темы
  • Участник
  • *
  • Сообщений: 129
  • Да будет crossplatform!
    • Просмотр профиля
Re: Проблемы с параметрами слота в Qt
« Ответ #4 : 05 Апреля 2011, 14:06:22 »
тут возникает интересный момент в том, что по описаниям trolltech разница в сигнатурах сигналов и слотов может быть. тоесть конструкция типа:
private slots:
void getSym(int);

connect (button, SIGNAL(clicked()), this SLOT(getSym(10));

допустима и работает. проблема сообственно в том, как в слот передать виджет с формы. по идее неявная адресация должна работать, т.е.

private slots:
 void getSym(QLineEdit &);

connect(button, SIGNAL (clicked()), this, SLOT(getSym(le));

где le - имя виджета с формы типа QLineEdit.

однако при попытке изменения каких либо параметров в слоте ничего не происходит, хотя синтаксически конструкция правильная. может я как-то не так передаю объекты с форм?

Оффлайн Белый пони

  • Любитель
  • *
  • Сообщений: 63
    • Просмотр профиля
Re: Проблемы с параметрами слота в Qt
« Ответ #5 : 05 Апреля 2011, 15:15:20 »
Я тоже в своё время столкнулся с тем, что не получалось разные типы переменных передавать, или разное количество переменных. Хотя в документации написано, что всё можно. В итоге забил, и теперь делаю вручную слоты с преобразованием :(
Может кто-то по-опытнее подскажет что делать:)

Оффлайн S_F_H

  • Автор темы
  • Участник
  • *
  • Сообщений: 129
  • Да будет crossplatform!
    • Просмотр профиля
Re: Проблемы с параметрами слота в Qt
« Ответ #6 : 05 Апреля 2011, 17:42:47 »
А есть ли вариант как-нибудь перехватывать события изменения значений ползунков? По крайней мере в .NET можно было таким вот образом получать имя вызвавшего события объекта, что в принципе упростило бы мне задачу, просто путем определения принадлежности ползунка к текстовому полю...

Оффлайн ChaosWarrior

  • Активист
  • *
  • Сообщений: 461
  • d(-_-)b
    • Просмотр профиля
Re: Проблемы с параметрами слота в Qt
« Ответ #7 : 06 Апреля 2011, 03:14:57 »
таких ползунков и полей может быть около двух сотен
Я так и знал про непотребство.

да, вот ссылка на архив с файлами проекта
http://zalil.ru/30801108
Я не знаю, как в runtime слот с сигналом соединять, вы похоже тоже. Может, кто умный обьяснит.

У тебя сигнал передаёт значение типа int, а слот принимает тип QLineEdit &
А по-моему, в сигнал поступает указатель на виджет (в смысле туда направляется объект, а он есть указатель), который каким-то чертом переделывается в просто указатель.

можно слайдеры и текстэдиты объединить в масиив (или QList) и потом в цикле их пересоединять. Хотя я так не пробовал.
А можно и все сразу присоединить.

Я тоже в своё время столкнулся с тем, что не получалось разные типы переменных передавать, или разное количество переменных. Хотя в документации написано, что всё можно. В итоге забил, и теперь делаю вручную слоты с преобразованием :(
Может кто-то по-опытнее подскажет что делать:)
Вы про это? Signals and slots can take any number of arguments of any type. Не-а, типы должны совпадать один в один, единственное в сигнале может быть больше аргументов, чем в слоте - лишние отбрасываются.

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


Итак, к делу.
таких ползунков и полей может быть около двух сотен
О, боже, зачем? Если нужно, чтобы было так, вам необходимо написать собственный виджет, на основе класса ползунка. Который будет сам рисовать текстовое поле и выводить в него значение.

И вот теперь, главная ошибка: зачем вам непременно двести одновременно существующих визуальных(!) компонентов?
Открытый код и его подержка — это лучшая реклама Windows.

Оффлайн S_F_H

  • Автор темы
  • Участник
  • *
  • Сообщений: 129
  • Да будет crossplatform!
    • Просмотр профиля
Re: Проблемы с параметрами слота в Qt
« Ответ #8 : 06 Апреля 2011, 22:09:45 »
как бы это не было печально, но задали написать программу стенд - которая будет отображать состояния нейронов... и рассматриваться будет нейронная цепь.... посему и требуется большое количество ползунков

Оффлайн Чистый

  • Почётный модератор
  • Старожил
  • *
  • Сообщений: 3473
  • nix - вот оно счастье...
    • Просмотр профиля
Re: Проблемы с параметрами слота в Qt
« Ответ #9 : 07 Апреля 2011, 00:06:31 »
я конечно не силен в Qt но может проще сделать ListBox c названиями параметров и одним ползунком менять параметр взависимости от того что выбрано?
Тестовый репозиторий kdeNeur ppa:devcode/kdeneur
各々が死ぬことをどのように決定する

Оффлайн S_F_H

  • Автор темы
  • Участник
  • *
  • Сообщений: 129
  • Да будет crossplatform!
    • Просмотр профиля
Re: Проблемы с параметрами слота в Qt
« Ответ #10 : 07 Апреля 2011, 01:52:40 »
дело в том. что происходить это буде на интерактивной доске, и для удобства это не совсем целесообразно. да, раз уж на то пошло, можно ли в слоте узнать имя объекта, который вызвал сигнал для его активации?

Оффлайн ChaosWarrior

  • Активист
  • *
  • Сообщений: 461
  • d(-_-)b
    • Просмотр профиля
Открытый код и его подержка — это лучшая реклама Windows.

Оффлайн S_F_H

  • Автор темы
  • Участник
  • *
  • Сообщений: 129
  • Да будет crossplatform!
    • Просмотр профиля
Re: Проблемы с параметрами слота в Qt
« Ответ #12 : 07 Апреля 2011, 09:32:42 »
о! а вот за ссылку спасибо))) впринципе можно взять на использование

 

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