| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > С/С++: Кроссплатформенное программирование, Qt/Gtk+/wxWidgets > [Qt4]не получается получить доступ к объекту |
| Автор: anatox91 9.4.2008, 11:10 | ||||||
| и снова здрасьте! есть класс диалогового окна, сделанный для главного окна(класс, унаследованный от QMainWindow), и в нем надо при нажатии кнопки проводить поиск в объекте класса QTextEdit, находящемся в главном окне, но при компиляции выводит ошибки: ![]() вот определение объекта: MainWindow.h
вот слот поиска в FindDialog.cpp:
а это слот вызывающийся при выборе пункта меню в главном окне: MainWindow.cpp
подскажите пожалуйста в чем ошибка? |
| Автор: SABROG 9.4.2008, 14:29 | ||
В способе доступа к указателю, через не статический объект textArea. Либо используй прямой указатель на MainWindow, либо делай указатель textArea глобальным/статическим для всех классов типа MainWindow, правда это будет глупостью. Сделай френдом класс MainWindow в классе FindDialog или передавай указатель на MainWindow в конструкторе. |
| Автор: Mephisto 9.4.2008, 14:44 | ||||
| У FindDialog делаешь сигнал к примеру FindNext. Далее просто:
Когда нужно именно искать из FindDialog, в нем пишешь код:
|
| Автор: anatox91 9.4.2008, 18:34 | ||||||||||
| блин... я вконец запутался... помогите кто-нибудь... в FindDialog.cpp я кроме конструктора сделал слот (вызывающийся после клика на кнопку в этом же классе)
в FindDialog.h сделал так
в MainWindow.h добавил
в MainWindow.срр :
компилятор пишет что не знает что такое lineFind и caseSensitivity (в двух последних приведенных мною функциях)... походу надо как-то передавать объект класса FindDialog в френд-функции... только я уже не соображаю как... |
| Автор: SABROG 10.4.2008, 11:43 | ||
| Френды хороши при использовании методов классов, которые не меняют внутреннего состояния объекта. Что-то типа функции перевода текста из одной кодировки в другую: QString & Utf8toAnsi(QString &), если эта функция приватна и находится в другом классе. Без указателя на mainwindow не обойтись. В своих программах я передаю указатель на mainwindow в каждый класс как parent QObject'a.
|
| Автор: anatox91 10.4.2008, 15:33 |
| ты имел ввиду что при создании объекта-потомка(т.е. в конструкторе) оставить потомку указатель на базовый объект и через него уже творить все операции? уррЯЯЯЯ!!! получилось!!! всем большое спасибо и по + |
| Автор: SABROG 10.4.2008, 15:35 |
| Нет, я не про наследование. Просто если есть главное окно, то в каждый класс, который использует компоненты главного окна надо передавать указатель в конструкторе класса или в метод. Или вообще указатель сделать глобальным для всех объектов, где нибудь в файле с main(). |
| Автор: anatox91 10.4.2008, 15:57 | ||||
| с примером Mephisto тоже самое... всегда вызывается функция nothing() при поиске... сделал в точности как Mephisto: FindDialog.h:
MainWindow.cpp
может я где-то в if-else инструкциях напутал?... мда.. походу точно где-то в инструкциях ошибка... потому что иногда находит то что нужно... |
| Автор: Mephisto 10.4.2008, 16:51 | ||
У меня вот так вот работает:
anatox91, а ты курсор установил в начало текстового окошка? Потому как по умлочанию он только ищет в тексте после курсора! Чтоб в обратную сторону поискать нужно установить флаг соответствующий. |
| Автор: anatox91 10.4.2008, 16:56 | ||
| походу нет.. и кстати что делает вот это:
? |
| Автор: Mephisto 10.4.2008, 17:14 |
| anatox91, у меня только один файл - main.cpp. Лень быол разносить по отдельным хидерам. Чтобы скомпилилось, нужно так в конце написать. Ента сенкс Архимеду, подсказал что так мона. Мышкой ткнуть как минимум А вообще я бы сделал прямой поиск, в случае неудачи обратный. Т.е. поиск в два шага: 1) Ищешь что нужно, проверяешь резалт, если не нашел, то к шагу 2 2) Ищешь назад, проверяешь резалт, если не нашел, то таки ничего нет |
| Автор: SABROG 10.4.2008, 17:15 | ||||
|
| Автор: anatox91 10.4.2008, 17:20 |
| Mephisto, хорошо так и сделаю SABROG, про QTextDocument::FindBackward я итак знал, а вот про мос спасибо, почитаю еще раз всем большое спасибо! |
| Автор: SABROG 10.4.2008, 17:22 | ||||
|
| Автор: Mephisto 10.4.2008, 17:30 |
| SABROG, ага. Можно конечно каретку двинуть. Но мне больше по душе поиск в обоих направлениях, ибо позиция курсора не изменится если ничего не найдешь! А если двинуть курсор в начало и ничего не найдешь, то пользователю нужно будет самому найти где же он остановился. А вообще по хорошему направление поиска лучше задать из твоего FindDialog. |
| Автор: SABROG 10.4.2008, 17:38 | ||
Я потому сначала коммент про флаги направлений вставил, а потом попутно ответил на вопрос про каретку. |
| Автор: anatox91 10.4.2008, 19:36 |
| а никак нельзя сначала запомнить положение курсора, а потом, после поиска, восстановить его в прежнюю позицию? хотя не, это бред, только что сам убедился - тогда всегда ищет только первое нужное слов и при следующем поиске находит тоже самое... |
| Автор: Mephisto 11.4.2008, 09:17 |
| Лучше всего из формы поиска задавать направление как по мне |
| Автор: anatox91 11.4.2008, 09:22 | ||
| Mephisto, думаю для пользователя это будет не удобно(вручную искать в одну сторону, а потом в другую, если не нашел ничего) в конце концов сделал вот так:
|