Qt начал изучать недавно, сегодня озадачился вопросом. опишу подробно.
имеем виджет ("parentWid") в котором есть объект textBrowser, при нажатии на ссылку в котором должно открываться окошко с определенной базой данных - в нашем случае "First". вроде все легко - ставим связь между ссылкой и создаем слот "openDatabase()"
QObject::connect(textBrowser, SIGNAL(anchorClicked(QUrl)), parentWid, SLOT(openDatabase()));
Из него вызываем еще одну связь для открытия нового окна:
void parentWid::openDatabase(){
emit openDatabase2();}
В main.cpp вызываем соединение с базой, выбираем базу данных, создаем окошко, настраиваем его и собссно получив сигнал "openDatabase2()" открываем получившееся окошко:
if (!createConnection()) { \\соединяемся с базой
return 1;}
QSqlTableModel model; \\выбираем БД
model.setTable(bd); \\имя базы, полученное из переменной
model.select();
model.setEditStrategy(QSqlTableModel::OnFieldChange);
QTableView view; \\устанавливаем модель
view.setModel(&model);
QObject::connect(&parentWid, SIGNAL(openDatabase2()),&bdtable, SLOT(show())); \\открытие виджета
Как итог - все работает, все отлично. Но встал вопрос добавления еще кнопок в главный виджет (на деле так же и из других виджетов должно вызываться), которые будут вызывать точно такое же окошко, но с другой базой. Меняться при этом по сути будет только одна строка -
Так вот, есть ли способ упростить код, чтоб не копировать всю конструкцию, а при нажатии разных кнопок вызывать данную конструкцию, но с разными базами?
Возможно каким то образом можно передать имя БД в качестве переменоой, но вот откуда и как, придумать не смог.
Решил попробовать таким образом - убрал из main.cpp создание нашего окна с базой данных, оставив только измененную связь:
QObject::connect(&parentWid, SIGNAL(openDatabase2(QString)),&mainWindow, SLOT(showBD(QString)));
при этом в классе parentWid поменял
void parentWid::openDatabase(){
emit openDatabase2();}
на
void parentWid::openDatabase(){
emit openDatabase2(base);}
передавая в переменной base имя базы - "first".
после этого добавил обработку слота "showBD(QString)", в которой и намеревался создавать окно с базой, название которой могло бы быть получено откуда угодно.
void mainWindow::showBD(QString bd){ \\записываем имя базы в переменную "bd"
QSqlTableModel model; \\выбираем БД
model.setTable(bd); \\имя базы, полученное из переменной
model.select();
model.setEditStrategy(QSqlTableModel::OnFieldChange);
QTableView view; \\устанавливаем модель
view.setModel(&model);
view.show(); \\выводим на экран
}
при этом программа запускается без ошибок, но при попытке открыть окно с БД, оно сразу же закрывается.