Russian Qt Forum

Qt => Пользовательский интерфейс (GUI) => Тема начата: eXeLe от Август 15, 2011, 06:55



Название: открытие окна с различным содержанием по нажатию разных кнопок
Отправлено: eXeLe от Август 15, 2011, 06:55

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()));  \\открытие виджета

Как итог - все работает, все отлично. Но встал вопрос добавления еще кнопок в главный виджет (на деле так же и из других виджетов должно вызываться), которые будут вызывать точно такое же окошко, но с другой базой. Меняться при этом по сути будет только одна строка -
Код:
     model.setTable("first");

Так вот, есть ли способ упростить код, чтоб не копировать всю конструкцию, а при нажатии разных кнопок вызывать данную конструкцию, но с разными базами?
Возможно каким то образом можно передать имя БД в качестве переменоой, но вот откуда и как, придумать не смог.

Решил попробовать таким образом - убрал из 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(); \\выводим на экран
}

при этом программа запускается без ошибок, но при попытке открыть окно с БД, оно сразу же закрывается.