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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Слоты. Передача значения по нажатию кнопки  (Прочитано 8391 раз)
passwd root
Гость
« : Декабрь 14, 2011, 08:35 »

Есть создание элементов в цикле, в том числе и кнопок.
При нажатии кнопки должна вызваться функция которая обработает строку(имя файла для открытия). Как вызвать и определить так слот.(Все время говорит , что нет такого слота)
void MainWindow::bookmark()
{
    QWidget *window = new QWidget;
    window->setWindowTitle("Bookmark");
QFile file("notgeneral.tmp");
     QGridLayout *layout = new  QGridLayout;
    if(file.open(QIODevice::ReadOnly | QIODevice::Text))
    {
        QTextStream in(&file);
        for(int i=0;!in.atEnd();i++)
        {
             QString str = in.readLine();
             QStringList fields = str.split("$");
             QLabel *label=new QLabel;
             label->setText(fields[0]);
             QPushButton *button1= new QPushButton;
             button1->setText("-");
             QPushButton *button2= new QPushButton;
             button2->setText("+");
             QPushButton *button3= new QPushButton;
             button3->setText("Play");
             layout->addWidget(label,i,0);
             layout->addWidget(button1,i,1);
             layout->addWidget(button2,i,2);
             layout->addWidget(button3,i,3);

             connect(button1,SIGNAL(clicked()),SLOT());
             connect(button2,SIGNAL(clicked()),SLOT());
             connect(button3,SIGNAL(clicked()),SLOT(O("/home/user/conds.mkv")));
        }
   }
   QPushButton *Add= new QPushButton;
   Add->setText("Add Serial");
   layout->addWidget(Add);
    window->setLayout(layout);
    connect(Add,SIGNAL(clicked()),SLOT(add()));
    window->show();
}

Public slot: O(QString name);

O(QString name) { open(name);}

Только изучаю Qt. Долго искал ответ так и не нашел
Лучше ответ с примером. Заранее спасибо
Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4747



Просмотр профиля WWW
« Ответ #1 : Декабрь 14, 2011, 08:53 »

только ведь задавали точно такой же вопрос, можно было бы и поиском воспользоваться.

у слота не может быть параметров больше, чем у сигнала. в данном случае у сигнала 0 параметров.

если строка фиксированная, то, естественно, нет смысла этим заморачиваться. в ином случае - QSignalMapper, в документации к нему есть отличный пример.
Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
passwd root
Гость
« Ответ #2 : Декабрь 23, 2011, 17:12 »

Спасибо, с этим разобрался.
void MainWindow::add()
{
QSignalMapper *signalMapper = new QSignalMapper();
QWidget *window2 = new QWidget;
QLineEdit *name=new QLineEdit();
QHBoxLayout *layout = new  QHBoxLayout;
QPushButton *button= new QPushButton;
name->setText("ааа");
layout->addWidget(name);
layout->addWidget(button);
window2->setLayout(layout);
connect(button, SIGNAL(clicked()), signalMapper, SLOT(map()));
signalMapper->setMapping(button ,QString(name->text()));
connect(signalMapper, SIGNAL(mapped(const QString &)), SLOT(clicked1(const QString &)));
window2->show();
}
 
По нажатию кнопки должно в функцию отправиться нынешнее состояние QLineEdit , но всегда отправляется ааа , даже если значение менял.(в поле)
Где я допустил ошибку?
Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4747



Просмотр профиля WWW
« Ответ #3 : Декабрь 23, 2011, 17:15 »

name->text() возвращает строку в момент обращения к ней, а не хранит указатель на строку. если тебе просто нужно считывать текст какого-то текстэдита, то добавь его в класс и используй его напрямую.
Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
passwd root
Гость
« Ответ #4 : Декабрь 23, 2011, 17:59 »

не совсем понял. Можно пример ?
Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4747



Просмотр профиля WWW
« Ответ #5 : Декабрь 23, 2011, 18:30 »

тут лучше создать класс-наследник для того виджета, который ты создаешь в add(), тогда и никаких сигналмапперов не нужно будет.
Код
C++ (Qt)
class MyWidget : public QWidget
{
   Q_OBJECT
 
public:
   MyWidget(QWidget *parent = 0) : QWidget(parent), name(new QLineEdit(this)), button(new QPushButton("button", this))
   {
       QHBoxLayout *layout = new QHBoxLayout;
       name->setText("ааа");
       layout->addWidget(name);
       layout->addWidget(button);
       setLayout(layout);
       connect(button, SIGNAL(clicked()), SLOT(clicked1()));
   }
 
private slots:
   void clicked1()
   {
       name->text(); // делай с этой строкой что хочешь
   }
 
private:
   QLineEdit *name;
   QPushButton *button;
};
 
...
 
void MainWindow::add()
{
   MyWidget *w = new MyWidget; // тут можно и параметр this передать конструктору
   w->show();
}
« Последнее редактирование: Декабрь 23, 2011, 18:35 от kambala » Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
passwd root
Гость
« Ответ #6 : Декабрь 23, 2011, 20:35 »

Выдает море ошибок. Например , что нет поля name(после public:). Все это впихнул в mainwindow.cpp. А проще как нибудь нельзя?
Большое спасибо за быстрые ответы.(кроме этого форума не где спросить по Qt).
Еще вопросы:есть один виджет(который в первом самом сообщении) , который при формирование получает данные из файла, при нажатии на кнопке в нем вызывается функция(получает из виджета строку через  signalMapper) , которая меняет значение в файле, но значение на форме изменится только , если закрыть и по новой открыть. Как мне это изменить ?
В Qt работаю из под ubuntu, как мне в ней собрать exe файл ? и как переносить библиотеки и файлы ?


Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4747



Просмотр профиля WWW
« Ответ #7 : Декабрь 23, 2011, 21:20 »

Выдает море ошибок. Например , что нет поля name(после public:). Все это впихнул в mainwindow.cpp. А проще как нибудь нельзя?
класс MyWidget вынеси в отдельные файлы класса - так будет лучше, чем громоздить его прямо в mainwindow. ну и пообъявляй или заинклудь используемые классы там (QLineEdit, QPushButton).
проще? это и есть проще Улыбающийся
которая меняет значение в файле, но значение на форме изменится только , если закрыть и по новой открыть. Как мне это изменить ?
видимо надо после этой операции перечитать файл заново (хотя лучше конечно использовать сохраненные значения, чем напрягать файловую систему лишний раз)
В Qt работаю из под ubuntu, как мне в ней собрать exe файл ? и как переносить библиотеки и файлы ?
где-то на форуме описывалось как это сделать, поищи. в крайнем случае собери под виндой Улыбающийся
Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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