crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

 
Ответить в данную темуНачать новую тему
> Работа с 2 формами
bigory
  опции профиля:
сообщение 2.2.2011, 18:07
Сообщение #1


Студент
*

Группа: Участник
Сообщений: 77
Регистрация: 10.10.2010
Пользователь №: 2099

Спасибо сказали: 0 раз(а)




Репутация:   0  


Всем доброе время суток!
Я пытаюсь реализовать систему поиска. Есть 2 формы: главное окно(MainWindow) и немодальное дочернее окно(search). На главном окне у меня таблица tableWidget. В этой таблице находятся данные. Дочернее окно, это окно поиска данных в таблице основного окна.

В основном окне при нажатии на кнопку, появляется дочернее окно. Код:
...
connect( pushButton, SIGNAL(clicked()), this, SLOT(search1()) );
...

void MainWindow::search1()
{
      search * dialog = new search( this );
      dialog->show();
}


Вот весь код, дочернего окна:
#include "search.h"
#include "ui_search.h"
#include "mainwindow.h"

search::search(QWidget *parent): QDialog(parent)
{
    setupUi(this);
    connect( pushButton, SIGNAL(clicked()), this, SLOT(search2()) );
}

void search::search2()
{
    QString text = lineEdit->text();

    MainWindow qmain( this );
    for (int j=0; j<qmain.tableWidget->rowCount(); ++j)
        {
            if (qmain.tableWidget->item(j,0)->text()==text)
            {
                int e=j;
                qmain.tableWidget->setCurrentCell( e, 0 );
            }
        }
}

search::~search()
{
}


Поиск работает как надо, но после того как поиск нашел то,чего я искал, то таблица в основном окне должна выделить ту строку, где те данные, которые я ищу. Почему-то вот этот код qmain.tableWidget->setCurrentCell( e, 0 ); не срабатывает.
Может быть я неправильно сделал то, что прописал MainWindow qmain( this ); Вот пытаюсь разобраться как это выделение таблицы реализовать.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 2.2.2011, 19:23
Сообщение #2


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9669
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 807 раз(а)




Репутация:   94  


Цитата(bigory @ 2.2.2011, 20:07) *
void search::search2()
{
...

MainWindow qmain( this );
...
зачем ты создаёшь главное окно в окне поиска, ведь главное окно уже существует?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
bigory
  опции профиля:
сообщение 2.2.2011, 19:24
Сообщение #3


Студент
*

Группа: Участник
Сообщений: 77
Регистрация: 10.10.2010
Пользователь №: 2099

Спасибо сказали: 0 раз(а)




Репутация:   0  


А как обратиться к элементам, которые находятся на той форме?

Сообщение отредактировал bigory - 2.2.2011, 19:29
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Алексей1153
  опции профиля:
сообщение 2.2.2011, 19:33
Сообщение #4


фрилансер
******

Группа: Участник
Сообщений: 2939
Регистрация: 19.6.2010
Из: Обливион
Пользователь №: 1822

Спасибо сказали: 215 раз(а)




Репутация:   34  


Цитата(bigory @ 2.2.2011, 21:24) *
А как обратиться к элементам, которые находятся на той форме?

передай в конструктор дочернего окна указатель на родительское. Либо примени сигналы и слоты
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 2.2.2011, 20:05
Сообщение #5


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9669
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 807 раз(а)




Репутация:   94  


Цитата(bigory @ 2.2.2011, 21:24) *
А как обратиться к элементам, которые находятся не той форме?
обращатся к элементам объекта-родителя плохая идея.

Создавать диалог поиска в куче (обычно не модальный) скорее всего незачем.

Картина обычно выглядит так:
У диалогового окна создаются методы для чтения его "полей", т.е. внутренних переменных объекта, которые понадобятся родительскому объекту. В твоём пример это может быть номер строки, в которой было что-то найдено. Допустим этот метод называется resultLine(), и возвращает int-овое значение.
void MainWindow::search1()
{
      search dialog( this );
      // если пользователь принял результат работы диалога (например, нажал кнопку "Ok")
      if (dialog.exec() == QDialog::Accepted){
             int line = dialog.resultLine();
             // выделяем строку line в таблице
     }
}


Цитата(Алексей1153 @ 2.2.2011, 21:33) *
дочернего окна указатель на родительское
он его и так передаёт - this

Можешь в качестве примера посмотреть Settings Editor Example
аналогом твоего void MainWindow::search1() там является void MainWindow::openSettings()

а реализация диалога - класс LocationDialog
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
bigory
  опции профиля:
сообщение 2.2.2011, 21:29
Сообщение #6


Студент
*

Группа: Участник
Сообщений: 77
Регистрация: 10.10.2010
Пользователь №: 2099

Спасибо сказали: 0 раз(а)




Репутация:   0  


Тут есть некоторая путанница, у меня немодальное окно

Сообщение отредактировал bigory - 2.2.2011, 23:26
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 24.4.2024, 3:37