Как работает кнопка onClick

Я немного запутался с обработкой 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? Потому что он не создает файл, если я нажму на него.

Я обновил код.

0

Решение

предполагая, что ваш класс 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, удалив аргумент.
Это потому, что сигнал кнопки не может обеспечить строку. Проще всего сделать его доступным в классе.

1

Другие решения

Вы не можете вызвать конкретный экземпляр аргумента в 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 но может использоваться в системе сигнал / слот без регистрации. и благодаря Фрэнк Остерфельд комментарий Я должен добавить, что только для подключенных к очереди сигналов / слотов необходима регистрация (я этого не знал)

спасибо

0

По вопросам рекламы [email protected]