像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); }  | 
					
发表评论
要发表评论,您必须先登录。