QT - 将QPushButtons与QCheckBox连接

时间:2018-04-25 14:40:18

标签: c++ qt

我是QT的新手。我开始创建一个TODO应用程序,我想以某种方式连接放置在向量中的PushButton和CheckBoxes,它们也放在不同的向量中。

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 :(得分:2)

clicked(bool)的{​​{1}}和SIGNAL的{​​{1}}呢?

类似的东西:

toggle()

答案 1 :(得分:1)

适用于我 - 您可以将小部件直接存储在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();
}

答案 2 :(得分:0)

使用Qt-5,您现在可以将lambda函数用作插槽(请参阅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 lambda,它按值捕获checkedi,然后将QCheckBox检查状态设置为其先前值的倒数