2013-05-24 35 views
5

Bản thân tôi đang cố viết một chương trình trong Qt kết nối một chức năng với một nút trong Qt5.Nút kết nối với chức năng tùy ý

#include <QApplication> 
#include <QtGui> 
#include <QPushButton> 
static void insert() 
{ 
    qDebug() << “pressed”; 
} 

int main(int argc,char *argv[]) 
{ 
    QApplication app(argc,argv); 
    QPushButton *button=new QPushButton(“button”); 
    button->setGeometry(50,100,150,80); 
    QObject::connect(button,&QPushButton::clicked,insert()); 
    button->show(); 
    } 

Nhưng tôi nhận được lỗi như main.cc:23:39: lỗi: trong bối cảnh này main.cc:23:55: lỗi: sử dụng không hợp lệ của khoảng trống biểu thực hiện: * [ main.o] Lỗi 1

Xin vui lòng giúp ...

+1

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

+0

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). –

+0

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

Trả lời

2

* 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.

+3

Điều này là sai. OP được chỉ định Qt5 và có thể. – UmNyobe

+0

@UmNyobe Cảm ơn bạn. Tôi hoàn toàn bị mất rằng đó là về Qt5.0 –

8

Trong Qt 5, bạn cần sử dụng qt signal and slots system mới. Kết nối sẽ trông giống như:

QObject::connect(button,&QPushButton::clicked,insert); <-- no parentheses. 

Điều này đã được nêu rõ nhưng bạn cần gọi app.exec(); để bắt đầu xử lý vòng lặp sự kiện. Nếu không, kết nối sẽ không bao giờ được kích hoạt.

Hơn nữa, nếu bạn đang ở trên chế độ phát hành sau đó bạn có thể không nhìn thấy đầu ra của qDebug()

+0

nó ném ra một lỗi 'spinBox: phải là một lớp hoặc không gian tên khi theo sau bởi ::' mặc dù tôi đang sử dụng Qt 5.4. – CroCo

Các vấn đề liên quan