0

我对 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")));
}

主文件

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();
}

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

我已经更新了代码。

4

2 回答 2

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 删除了参数。那是因为按钮的信号不能提供字符串。更简单的方法是让它在课堂上可用。

于 2013-07-27T14:07:51.313 回答
0

您不能在connect函数调用中调用特定的参数实例。

connect由 MOC元对象编译器处理,并为所有具有宏的对象添加一些魔法Q_OBJECTconnect您必须在其中仅指定它将接收的参数的函数中调用一个函数。(如果它们不是 qt 对象,则必须向它们注册,qRegisterMetaType<MyDataType>("MyDataType");但这是另一回事)。

所以,请记住,每次调用:

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

接着:

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

编辑:

感谢Riateche 的评论,我必须指定您需要qRegisterMetaType<MyDataType>("MyDataType");的所有对象都未在此列表中列出。QString不是继承自QObject但可以在没有注册的信号/槽系统中使用。并且感谢Frank Osterfeld的评论,我必须补充一点,只有排队的信号/插槽连接才需要注册(我不知道)

感谢

于 2013-07-27T14:28:30.373 回答