簡體   English   中英

QT-將QPushButton與QCheckBoxes連接

[英]QT - connecting QPushButtons with QCheckBoxes

我是QT新手。 我開始創建TODO應用,我想以某種方式將放置在矢量中的按鈕與也放置在不同矢量中的CheckBox連接起來。

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()中,但是它們都不起作用。 “沒有一個起作用”是指當單擊按鈕時什么也沒有發生的事實。 程序通常已編譯,沒有任何錯誤。

剛剛clicked(bool)SIGNALtoggle()SLOT怎么辦?

像這樣:

connect(pushButton, SIGNAL(clicked(bool)), checkBox, SLOT(toggle()));

適用於我-您可以將小部件直接存儲在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();
}

使用Qt-5,您現在可以將lambda函數用作插槽(請參閱連接版本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選中的狀態設置為其先前值的倒數

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM