2012年7月3日

QT:使用自訂signals與slots

這幾天研究了一下,終於可以動了........以下為程式碼




test.h


#ifndef TEST_H
#define TEST_H
#include <qwidget>
#include <qlabel>
class test:public QWidget
{
private:
    int value;
    QLabel *label;
    Q_OBJECT
public:
    test(QWidget *parent=0);

public slots:
   void setvalue(bool);
signals:
     void valueChanged(int);

};
#endif // TEST_H



test.cpp


#include <test.h>
#include <qpushbutton>
#include <qvboxlayout>

test::test(QWidget *parent):QWidget(parent)
{
    value=20;
    QPushButton *start = new QPushButton(tr("Start"));
    start-&gt;setFont(QFont("Times", 18, QFont::Bold));
    QLabel *label=new QLabel();
    label-&gt;setNum(123.0);
    connect(start,SIGNAL(clicked(bool)),this,SLOT(setvalue(bool)));
    connect(this,SIGNAL(valueChanged(int)),label,SLOT(setNum(int)));
    QVBoxLayout *layout=new QVBoxLayout();
    layout-&gt;addWidget(start);
    layout-&gt;addWidget(label);
    setLayout(layout);
}

void test::setvalue(bool)
{
    emit valueChanged(value);
}


main.cpp


#include <qapplication>
#include <test.h>
int main(int argc, char *argv[])
{
    QApplication app(argc, argv);
    test A;
    A.show();
    return app.exec();
}












========================================================================

重點:

1. 有提到signal-slot之間的連接(或signal-signal)必須使用相同的參數型態以及相同的參數順序
2. 在Qt中,所有的類別若有signals或slots,則一定要載宣告最上方提及Q_OBJECT
3. signals和slots機制是type-safe:signal和其接受的slot必須要相符合,而compiler可以自動偵測type是否符合。
4. signals和slots機制是loosely coupled:發送signal的類別不需要知道哪一個slot會接受所發送的 signal。此機制會確保當你在"連接"(connect)了一個signal和slot後,slot會接受signal的參數並且正確執行。 signal和slot可接受任何數量、任何型態的參數,因此是完全的type-safe。
5. 所有的類別都是繼承至QObject或是其子類別,且可同時擁有signal和slot,因此,所有的訊息傳送與接收,都是物件;物件不必知道是誰接收了它發送的signal,這就達成了物件導向中的資訊封裝(information encapsulation),並確保物件可做為軟體元件(software component)。

=====================================================================================

之前不知道必須使用相同的資料型態,怎麼弄都搞不定.......搞半天.......

沒有留言:

張貼留言