我对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函数?因为它不创建文件,如果我点击它。
我已经更新了代码。
答案 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评论我必须补充说,只有排队的信号/插槽连接需要注册(我不知道)
感谢