按钮onClick如何工作

时间:2013-07-27 13:59:38

标签: c++ qt qtgui

我对Qt的onClick处理有点困惑。我有一个看起来像这样的课:

class DatabaseManager : public QObject
{
Q_OBJECT;
private:
    QSqlDatabase db;

public slots: 
    bool openDB(const QString& path);

};

我有一个处理按钮点击的课程:

Click::Click(QWidget *parent) : QWidget(parent){
    QPushButton *create = new QPushButton("Create database", this);
    create->setGeometry(50,100,100,100);
    connect(create, SIGNAL(clicked()), this, SLOT(openDB("/home/peter/database.db")));
}

的main.cpp

int main(int argc,char **argv){
    QApplication *app = new QApplication(argc, argv);
    QPushButton btn;

    DatabaseManager db;
    btn.move(300,300);
    btn.resize(250,250);
    btn.setWindowTitle("Dibli");
    btn.show();
    return app->exec();
}

我怎么能告诉click处理程序,我想使用特定的DatabaseManager对象的openDB函数?因为它不创建文件,如果我点击它。

我已经更新了代码。

2 个答案:

答案 0 :(得分:1)

假设您的Click类派生自QObject,您应该添加一个插槽

public slots:
 void onClick() { openDB("/home/peter/database.db"); }

并连接:

connect(create, SIGNAL(clicked()), this, SLOT(onClick()))

编辑由于您现在显示更多代码,因此这是一个不同的提示。改变主要像

int main(int argc,char **argv){
    QApplication *app = new QApplication(argc, argv);
    QPushButton btn;

    DatabaseManager db;
    db.path = "/home/peter/database.db";
    QObject::connect(&btn, SIGNAL(clicked()), &db, SLOT(openDB()));

    btn.move(300,300);
    btn.resize(250,250);
    btn.setWindowTitle("Dibli");
    btn.show();

    return app->exec();
}

class DatabaseManager : public QObject
{
Q_OBJECT;
private:
    QSqlDatabase db;

public:
    QString path;

public slots: 
    bool openDB();

};

注意我向DatabaseManager添加了一个成员变量(db.path),并更改了删除该参数的插槽openDB。 那是因为按钮'信号无法提供字符串。更简单的方法是让它在课堂上可用。

答案 1 :(得分:0)

您无法在connect函数调用中调用特定的参数实例。

connect由MOC处理 - meta object compiler - 并为具有宏Q_OBJECT的所有对象添加一些魔法。您必须在connect内调用一个函数,在该函数中只指定它将接收的参数。 (如果它们是非qt-object,你必须用qRegisterMetaType<MyDataType>("MyDataType");注册它们,但这是一个不同的故事。)

所以,记住,每次打电话:

connect(sender, SIGNAL( event() ),
        receiver, SLOT( onEvent() ))

然后:

void onEvent() {
    mycomplexoperation( ... )
}

编辑:

感谢Riateche评论,我必须指明您需要qRegisterMetaType<MyDataType>("MyDataType");,而list中未列出所有对象。 QString不会从QObject继承,但可以在信号/插槽系统中使用而无需注册。并且感谢Frank Osterfeld评论我必须补充说,只有排队的信号/插槽连接需要注册(我不知道)

感谢