QSignalMapper使用と使用シナリオ
QSignalMapperクラスは、非基準信号の系列を収集し、次いで、送信者に対する信号を使用して、整数、文字列、または制御パラメータにそれらを送り返します。(私は読書を理解するために、それは問題ではありません理解していませんでした)
一般的なシナリオ
実際には、典型的な使用シナリオのクラスは、コントロールの多くは、対応するスロットに機能する必要があり、スロットはこれらの機能を達成し、ほぼ同じことです。この場合には、最も直接的な方法は、各制御信号の対応する機能のためのスロットを作成することがあります。しかし、これは重複したコードの多くにつながることができます。この時点で、私たちは、この要件を実装するためにQSignalMapperを使用することができます。
- QSignalMapperクラスは、特定の整数または文字列にSetMapping()関数をサポートし、特定のオブジェクトを関連付けます。
信号は、(例えばクリックされたボタンのような)溝にオブジェクトQSignalMapperオブジェクトマップ()関数に接続することができ、及び地図()関数は、マップされた文字列または()信号の整数を送信するようにオブジェクトに関連付けられたスロットを使用します。
したがって、限り、我々は、溝の処理を制御するためにマッピングされた機能()信号、同様の機能の多数に接続された溝を画定するように。
我々は説明するための例があります。以下のようにインタフェースがある:(CSDNから第二の物品の例には、わずかな追加の改変)
補足事項を慎重に見てください。これは、対応する3つの上に書き込まれます。
インターフェイスの初期化コードは次のとおりです。
void Widget::InitUi()
{
names << "宋江" << "卢俊义" << "吴用" << "公孙胜"
<< "关胜" << "林冲" << "秦明" << "呼延灼"
<< "花荣" << "柴进" << "李应" << "朱仝"
<< "鲁智深" << "武松" << "董平" << "张清";
QGridLayout *gridLayout = new QGridLayout;
for (int i = 0; i < names.size(); ++i)
{
QPushButton *button = new QPushButton(names[i]);
// 使用setMapping()函数将一个特定的整数或字符串或对象(qt doc截图那些)和一个特定的对象关联起来。
signalMapper->setMapping(button, names[i]);
// 这就是可以将对象的信号连接到QSignalMapper对象的map()槽函数上
connect(button, SIGNAL(clicked()), signalMapper, SLOT(map()));
gridLayout->addWidget(button, i / 4, i % 4);
}
// 将我们定义的槽函数连接到mapped()信号 // 注意看mapped的写法
connect(signalMapper, SIGNAL(mapped(QString)),this, SLOT(ShowName(QString)));
setLayout(gridLayout);
}
これは、各ボタンのテキストを格納するためのプライベート変数であるQStringList名。ShowName()は、我々は、すべての信号がスロット機能に接続されている)(ボタンをクリックするように、我々は、溝を画定する機能です。ウィンドウクラスで次の文:
public slots:
void ShowName(QString name);
private:
void InitUi();
private:
Ui::Widget *ui;
QSignalMapper* signalMapper;
QStringList names;
ShowName()関数は、溝、簡単なポップアップメッセージボックスとして実現され、テキストは現在のクリックボタンが表示されます。
void Widget::ShowName(QString name)
{
QMessageBox::information(this, "Name", name);
}
もちろん、私たちの初期化インタフェースのメソッド、および当社signalMapperオブジェクトの例を呼び出し、コンストラクタで忘れてはいけません。次のように:
ui->setupUi(this);
signalMapper = new QSignalMapper(this);
InitUi();
以下は参照です。表示されていない参照してください。
値下げに動いよく書かこれは、見ることができます
QSignalMapperクラスは、信号リピータおよび翻訳者として見ることができます。
これは、信号パラメータ、QObjectを* QWidgetの*または複数のパラメータ、および転送をQStringの、INTとの翻訳パラメータに非基準信号であってもよいです。
QSignalMapper機能コアクラスは、所望の原信号データ(setMapper機能)へのオブジェクトのマッピングを確立することです。スロットQSignalMapperとしてマップ()関数は、ルールsetMappingに従ってマッピングされた()信号を転送します。
QSignalMapperは、1つのマッピングに濃縮変換することによって、N-1のマッピングに対応する信号を達成するために、スロットと同様の処理の複数であってもよいです。
例:ボタンの束がありますが、処理中の関数、限りので、各ボタンのスロットに関数を記述していない、数やライン上のボタンに名前をコンパイルするためのボタン、および非常に簡単でクリックすることができます()イベント。
//mywidget.h
class MyWidget : public QWidget
{
Q_OBJECT
public:
explicit MyWidget(QWidget *parent = 0);
signals:
public slots:
//处理最终信号的槽
void doClicked(const QString &btnName);
private:
QSignalMapper *signalMapper;
};
//mywidget.cpp
MyWidget::MyWidget(QWidget *parent) :
QWidget(parent)
{
QString buttonText = "btn1,btn2,btn3,btn4,btn5,btn6,btn7,btn8,btn9,btn10";
QStringList textList = buttonText.split(",");
signalMapper = new QSignalMapper(this);
QGridLayout *gridLayout = new QGridLayout;
for(int i=0; i<textList.size(); ++i)
{
//动态创建按钮
QPushButton *button = new QPushButton(textList[i]);
//原始信号传递给signalMapper
connect(button,SIGNAL(clicked()),signalMapper,SLOT(map()));
//设置signalMapper的转发规则,转发为参数为QString类型的信号,并把textList[i]的内容作为实参传递
signalMapper->setMapping(button, textList[i]);
gridLayout->addWidget(button, i/3, i%3);
}
//将转发的信号连接到最终的槽函数上
connect(signalMapper,SIGNAL(mapped(QString)),this,SLOT(doClicked(QString)));
setLayout(gridLayout);
}
void MyWidget::doClicked(const QString &btnName)
{
//显示被按下的button名称
QMessageBox::information(this,"Clicked",btnName+" is clicked !");
}
例:
signalMapperの最初の時間で元の信号を受信できるように、まず、パラメータなしで生信号は、マップ()関数signalMapper溝に接続され、
マッピング関係setMapperコールの第二の方法、生信号signalMapperを処理する方法を伝えます。この例では、信号QStringのパラメータを使用して、元の信号の変換であり、
最後に受信した信号変換、変換された信号のスロット機能と接続のパラメータを持つスロットの機能に所望のデータを得るために
;マッピング関係は、()removeMappingsによって除去することができる
パラメータ4つのみsetMapping機能、および形式に厳密に従って書くことが、第一のconst QStringの&、第INT、第QObjectを*、第QWidgetの*、用後者の二つは、信号処理機能におけるそれらのサブクラス、変換のタイプを必要とします。