* thấy chỉnh sửa bên dưới
Trước hết bạn không thể kết nối tín hiệu với một chức năng, bạn nên kết nối nó với một khe của một số lớp, và một thể hiện của lớp này cũng phải được cung cấp cho QObject::connect
.
Vì vậy, điều đầu tiên cần làm là xác định một lớp học với một khe cắm:
// file 'C.h'
#ifndef __C_H__
#define __C_H__
#include <QtGui>
class C : public QObject{
Q_OBJECT
public slots:
static void insert()
{
qDebug() << "pressed";
}
};
#endif
Lưu ý rằng lớp này phải kế thừa từ QObject
và có Q_OBJECT
từ khóa bên trong nó. Bạn phải đặt khai báo lớp này trong một tệp *.h
(bạn không thể có Q_OBJECT
trong các tệp *.cpp
vì Qt sẽ không nhìn thấy nó).
Bây giờ bạn có một lớp học với một khe cắm, bạn có thể sử dụng QObject::connect
, cách thích hợp sẽ là:
QObject::connect(button, SIGNAL(clicked()), &c, SLOT(insert()));
Lưu ý rằng bạn phải sử dụng SIGNAL()
macro cho tín hiệu và SLOT()
macro cho khe khi bạn kết nối chúng.
Vì vậy, các mã trong main.cpp
nên thực hiện như sau:
#include "C.h"
int main(int argc,char *argv[])
{
QApplication app(argc,argv);
QPushButton *button=new QPushButton("button");
button->setGeometry(50,100,150,80);
C c;
QObject::connect(button, SIGNAL(clicked()), &c, SLOT(insert()));
button->show();
return app.exec();
}
Bạn thấy thế nào tôi cung cấp một thể hiện của một đối tượng nhận (&c
) để connect()
chức năng, bạn phải làm điều đó ngay cả khi chức năng của bạn là static
.
Và cuối cùng bạn phải app.exec();
vì nếu không chương trình của bạn sẽ không có vòng lặp tin nhắn.
EDIT:
tôi bị mất rằng vấn đề là về Qt 5. Đối với Qt 5.0 câu trả lời là sai.
tôi không biết nhiều về qt 5, nhưng tôi nghĩ rằng bạn cần phải loại bỏ các parathesis trong 'insert()' với ' insert'. – Jichao
tôi không biết về Qt nhưng chức năng của bạn gọi 'QObject :: connect' không khớp với nguyên mẫu được đưa ra ở đây [Qt] (http://qt-project.org/doc/qt-4.8/qobject.html). –
Ngoài ra, tôi nghi ngờ điều này sẽ làm việc mà không có 'return app.exec()' ở cuối hàm 'main'. – Amartel