這幾天研究了一下,終於可以動了........以下為程式碼
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->setFont(QFont("Times", 18, QFont::Bold));
QLabel *label=new QLabel();
label->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->addWidget(start);
layout->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)。
=====================================================================================
之前不知道必須使用相同的資料型態,怎麼弄都搞不定.......搞半天.......


沒有留言:
張貼留言