Я немного запутался с обработкой 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();
}
Как я могу сообщить обработчику кликов, что я хочу использовать функцию openDB определенного объекта DatabaseManager? Потому что он не создает файл, если я нажму на него.
Я обновил код.
предполагая, что ваш класс 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();
};
Примечание. Я добавил переменную-член (db.path) в DatabaseManager и изменил слот openDB, удалив аргумент.
Это потому, что сигнал кнопки не может обеспечить строку. Проще всего сделать его доступным в классе.
Вы не можете вызвать конкретный экземпляр аргумента в connect
вызов функции.
connect
обрабатывается МОС — мета-объектный компилятор — и добавить немного магии ко всему объекту, который имеет макрос Q_OBJECT
, Вы должны вызвать функцию внутри connect
в котором вы указываете только аргумент, который он получит. (И если они не являются объектами qt, вы должны зарегистрировать их qRegisterMetaType<MyDataType>("MyDataType");
но это другая история).
Итак, помните, каждый раз звоните:
connect(sender, SIGNAL( event() ),
receiver, SLOT( onEvent() ))
а потом:
void onEvent() {
mycomplexoperation( ... )
}
благодаря Riateche комментарий, я должен указать, что вам нужно qRegisterMetaType<MyDataType>("MyDataType");
со всем объектом, не перечисленным в этом список. QString
не наследуется от QObject
но может использоваться в системе сигнал / слот без регистрации. и благодаря Фрэнк Остерфельд комментарий Я должен добавить, что только для подключенных к очереди сигналов / слотов необходима регистрация (я этого не знал)
спасибо