像QQ的好友列表那样排列多个按钮是一项很不错的技术,使用QToolBox可以简单地实现这个需求,而运用QT的QSignalMapper类又可以方便地处理大量由不同控件发出的信号,以下是基于这两技术的一个小例子。
思路:
1:创建多个按钮(或其他控件),并将它们放到一个group里去。
2:将按钮的clicked信号连接到signalmapper中去,并设置它们的“信号转换规则。
3:连接signalmapper的mapped信号与最终要调用的糟(ClickedButton)。
程序截图:
源代码:
main.cpp
1 2 3 4 5 6 7 8 9 10 11 |
#include "buttonsbox.h" #include <QApplication> int main(int argc, char *argv[]) { QApplication a(argc, argv); ButtonsBox w; w.show(); return a.exec(); } |
buttonsbox.h
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
#ifndef BUTTONSBOX_H #define BUTTONSBOX_H #include <QToolBox> #include <QPushButton> #include <QSignalMapper> const int NUMBER = 100; class ButtonsBox : public QToolBox { Q_OBJECT private: QPushButton *button[NUMBER]; QSignalMapper *signalMapper; public: ButtonsBox(QWidget *parent = 0); public slots: void ClickedButton(const QString &text); }; #endif // BUTTONSBOX_H |
buttonsbox.cpp
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 |
#include "buttonsbox.h" #include <QGroupBox> #include <QVBoxLayout> #include <QMessageBox> ButtonsBox::ButtonsBox(QWidget *parent /* = 0 */) : QToolBox(parent) { signalMapper = new QSignalMapper(this); QGroupBox *groupBox = new QGroupBox; QVBoxLayout *subLayout = new QVBoxLayout(groupBox); //处理最终信号的槽 connect(signalMapper, SIGNAL(mapped(const QString&)), this, SLOT(ClickedButton(const QString&))); for(int i=0; i<NUMBER; i++) { QString text = QString::number(i); button[i] = new QPushButton(this); button[i]->setText( text ); subLayout->addWidget(button[i]); //原始信号传递给signalmapper connect(button[i], SIGNAL(clicked()), signalMapper, SLOT(map())); //设置signalmapper的转发规则, 转发为参数为QString类型的信号, 并把text的内容作为参数传递。 signalMapper->setMapping(button[i], text); } addItem(groupBox, "All Buttons"); } void ButtonsBox::ClickedButton(const QString &text) { QMessageBox::information(this, "OK", text); } |
发表评论
要发表评论,您必须先登录。