您的位置:首页 > 编程语言 > Qt开发

QT:有序排放多个按钮并处理它们的信号

2012-01-05 21:05 323 查看
    像QQ的好友列表那样排列多个按钮是一项很不错的技术,使用QToolBox可以简单地实现这个需求,而运用QT的QSignalMapper类又可以方便地处理大量由不同控件发出的信号,以下是基于这两技术的一个小例子。

思路:

1:创建多个按钮(或其他控件),并将它们放到一个group里去。

2:将按钮的clicked信号连接到signalmapper中去,并设置它们的“信号转换规则。
3:连接signalmapper的mapped信号与最终要调用的糟(ClickedButton)。

程序截图:



源代码:

#include <QtGui>
#include <QtCore>

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);
};

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);
}

#include "main.moc"

int main(int argc, char **argv)
{
QApplication app(argc, argv);
ButtonsBox *toolBox = new ButtonsBox;
toolBox->show();
return app.exec();
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  qt button signal class qq