QT - соединение QPushButtons с QCheckBoxes - PullRequest
0 голосов
/ 25 апреля 2018

Я новичок в QT. Я начал создавать приложение TODO и хочу каким-то образом соединить свои кнопки, помещенные в вектор, с флажками, которые также размещены в другом векторе.

std::vector <QPushButton*> buttons;
std::vector <QCheckBox*> checks;

Я подумал, что лучший способ сделать это - создать цикл for, соединяющий каждый элемент упомянутых векторов

Что-то вроде:

for(int i=0; i<buttons.size(); ++i){
    connect(buttons[i], SIGNAL(???), checks[i], SLOT(???));
}

Но идея - единственное, что у меня есть. Я пытался поместить разные вещи в SIGNAL () и SLOT (), но ни одна из них не сработала. Под «ни один из них не работает» я имею в виду тот факт, что при нажатии кнопки ничего не происходит. Программа обычно компилируется без ошибок.

Ответы [ 3 ]

0 голосов
/ 25 апреля 2018

С Qt-5 вы теперь можете использовать лямбда-функции в качестве слотов (см. connect version 5 )

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

QObject::connect(buttons[i], &QPushButton::clicked, [=]
    {
        // toggle the check state
        checks[i]->setChecked(!checks[i]->isChecked());
    });

Первые два параметра - это указатель на объект, а указатель на функцию-член

  • buttons[i] имеет тип QPushButton*
  • &QPushButton::clicked - указатель на функцию-член сигнала, к которому вы хотите подключиться

Второй параметр - лямбда-код C ++ 11, который захватывает checked и iзначение, а затем устанавливает проверенное состояние QCheckBox равным его предыдущему значению

0 голосов
/ 25 апреля 2018

Работает для меня - и вы можете хранить виджеты непосредственно в std::list: во избежание необходимости возиться с ручным управлением памятью. Пусть библиотеки сделают это за вас.

#include <QtWidgets>
#include <list>
int main(int argc, char **argv) {
   QApplication app{argc, argv};
   QWidget win;
   QGridLayout layout{&win};
   std::list<QPushButton> buttons;
   std::list<QCheckBox> checkboxes;
   QPushButton addButton{"Add"};
   layout.addWidget(&addButton, 0, 0, 2, 1);
   auto const clicked = &QAbstractButton::clicked;
   auto const toggle = &QAbstractButton::toggle;
   auto const add = [&,clicked,toggle]{
      int const col = layout.columnCount();
      auto const text = QString::number(col);
      auto *button = &(buttons.emplace_back(text), buttons.back()); //C++11, not 14
      auto *checkbox = &(checkboxes.emplace_back(text), checkboxes.back());
      layout.addWidget(button, 0, col);
      layout.addWidget(checkbox, 1, col);
      QObject::connect(button, clicked, checkbox, toggle);
   };
   add();
   QObject::connect(&addButton, clicked, add);
   win.show();
   return app.exec();
}
0 голосов
/ 25 апреля 2018

А как насчет clicked(bool) для SIGNAL и toggle() для SLOT?

Примерно так:

connect(pushButton, SIGNAL(clicked(bool)), checkBox, SLOT(toggle()));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...