Поиск:

Ответ в темуСоздание новой темы Создание опроса
> [Qt4]не получается получить доступ к объекту, находящемуся в другом хедере 
V
    Опции темы
anatox91
Дата 9.4.2008, 11:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


программист-самоучка
**


Профиль
Группа: Участник
Сообщений: 699
Регистрация: 12.1.2008
Где: ++Украина.Крым++

Репутация: нет
Всего: 13



и снова здрасьте!

есть класс диалогового окна, сделанный для главного окна(класс, унаследованный от QMainWindow), и в нем надо при нажатии кнопки проводить поиск в объекте класса QTextEdit, находящемся в главном окне, но при компиляции выводит ошибки:
user posted image
вот определение объекта:
MainWindow.h
Код

public:                              //15 строка
       MainWindow();         //16
       QTextEdit *textArea;  //17


вот слот поиска в FindDialog.cpp:
Код

void FindDialog::slotFind() {                                    //32
     strFind = lineFind->text();                                   //33
     if(!strFind.isEmpty()) {                                         //34
                            if(caseSensitivity->isChecked()) { //35
                                                            if(!(MainWindow::textArea->find(strFind, QTextDocument::FindCaseSensitively))) { //36
                                                                                                     nothing();  //37
                                                                                                     }                //38
                                                            }                                                          //39
                            else {                                                                                  //40
                                 if(!(MainWindow::textArea->find(strFind))) {                 //41
                                                                            nothing();                            //42
                                                                            }
                                 }
                            }
     else emptyString();
}


а это слот вызывающийся при выборе пункта меню в главном окне:
MainWindow.cpp
Код

void MainWindow::findNext() {
     FindDialog *findDlg = new FindDialog;
     if(findDlg->exec() == QDialog::Rejected) {
                        delete findDlg;
                        }
}


подскажите пожалуйста в чем ошибка?  smile 
 

Это сообщение отредактировал(а) anatox91 - 9.4.2008, 11:28


--------------------

The code is the design ©

Sony VAIO VGN-FW480J

user posted image
PM MAIL ICQ   Вверх
SABROG
Дата 9.4.2008, 14:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Hacker
****


Профиль
Группа: Завсегдатай
Сообщений: 2481
Регистрация: 18.9.2006

Репутация: 81
Всего: 91



Код

MainWindow::textArea->find(strFind)


В способе доступа к указателю, через не статический объект textArea.

Либо используй прямой указатель на MainWindow, либо делай указатель textArea глобальным/статическим для всех классов типа MainWindow, правда это будет глупостью. Сделай френдом класс MainWindow в классе FindDialog или передавай указатель на MainWindow в конструкторе.

Это сообщение отредактировал(а) SABROG - 9.4.2008, 14:31


--------------------
Национальная группа Russian Federation на QtCentre.
PM MAIL   Вверх
Mephisto
Дата 9.4.2008, 14:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Волкъ
***


Профиль
Группа: Завсегдатай
Сообщений: 1818
Регистрация: 27.8.2003
Где: Питер

Репутация: 1
Всего: 34



У FindDialog делаешь сигнал к примеру FindNext.
Далее просто:
Код

void MainWindow::findNext() {
     FindDialog *findDlg = new FindDialog;
     connect(findDlg, SIGNAL(FindNext()), SLOT(slotFind()));
     if(findDlg->exec() == QDialog::Rejected) {
                        delete findDlg;
                        }
}

Когда нужно именно искать из FindDialog, в нем пишешь код:
Код

emit FindNext();


Это сообщение отредактировал(а) Mephisto - 9.4.2008, 14:44
PM   Вверх
anatox91
Дата 9.4.2008, 18:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


программист-самоучка
**


Профиль
Группа: Участник
Сообщений: 699
Регистрация: 12.1.2008
Где: ++Украина.Крым++

Репутация: нет
Всего: 13



блин... я вконец запутался... помогите кто-нибудь...
в FindDialog.cpp я кроме конструктора сделал слот (вызывающийся после клика на кнопку в этом же классе)
Код

void FindDialog::fN() {
     emit fndNext();
}


в FindDialog.h сделал так
Код

public:
       FindDialog(QWidget *parent = 0);
       friend QString MainWindow::getStrFind();
       friend bool MainWindow::isSensitivity();
public slots:
       void fN();
signals:
        void fndNext();

в MainWindow.h добавил
Код

public slots:
        void findNext();
        void slotFind();

Код

public:
        QString getStrFind();
        bool isSensitivity();


в MainWindow.срр :
Код

void MainWindow::findNext() {
     FindDialog *findDlg = new FindDialog;
     connect(findDlg, SIGNAL(fndNext()), SLOT(slotFind()));
     if(findDlg->exec() == QDialog::Rejected) {
                        delete findDlg;
                        }
}
void MainWindow::slotFind() {
     QString strFind = getStrFind();
     if(!strFind.isEmpty()) {
                            if(isSensitivity()) {
                                                            if(!(textArea->find(strFind, QTextDocument::FindCaseSensitively))) {
                                                                                                     nothing();
                                                                                                     }
                                                            }
                            else {
                                 if(!(textArea->find(strFind))) {
                                                                            nothing();
                                                                            }
                                 }
                            }
     else emptyString();
}
QString MainWindow::getStrFind() {
        return lineFind->text();
}
bool MainWindow::isSensitivity() {
     return caseSensitivity->isChecked();
}


компилятор пишет что не знает что такое lineFind и caseSensitivity (в двух последних приведенных мною функциях)...  smile  smile 

походу надо как-то передавать объект класса FindDialog в френд-функции... только я уже не соображаю как...  smile 

Это сообщение отредактировал(а) anatox91 - 9.4.2008, 18:41


--------------------

The code is the design ©

Sony VAIO VGN-FW480J

user posted image
PM MAIL ICQ   Вверх
SABROG
Дата 10.4.2008, 11:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Hacker
****


Профиль
Группа: Завсегдатай
Сообщений: 2481
Регистрация: 18.9.2006

Репутация: 81
Всего: 91



Френды хороши при использовании методов классов, которые не меняют внутреннего состояния объекта. Что-то типа функции перевода текста из одной кодировки в другую: QString & Utf8toAnsi(QString &), если эта функция приватна и находится в другом классе.

Без указателя на mainwindow не обойтись. В своих программах я передаю указатель на mainwindow в каждый класс как parent QObject'a.

Код

cfrSelectForm::cfrSelectForm(QWidget *parent): QDialog(parent, Qt::Sheet)
{
    main = qobject_cast<TMainWindow *>(parent);



--------------------
Национальная группа Russian Federation на QtCentre.
PM MAIL   Вверх
anatox91
Дата 10.4.2008, 15:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


программист-самоучка
**


Профиль
Группа: Участник
Сообщений: 699
Регистрация: 12.1.2008
Где: ++Украина.Крым++

Репутация: нет
Всего: 13



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

уррЯЯЯЯ!!! получилось!!! всем большое спасибо и по +

Это сообщение отредактировал(а) anatox91 - 10.4.2008, 15:41


--------------------

The code is the design ©

Sony VAIO VGN-FW480J

user posted image
PM MAIL ICQ   Вверх
SABROG
Дата 10.4.2008, 15:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Hacker
****


Профиль
Группа: Завсегдатай
Сообщений: 2481
Регистрация: 18.9.2006

Репутация: 81
Всего: 91



Нет, я не про наследование. Просто если есть главное окно, то в каждый класс, который использует компоненты главного окна надо передавать указатель в конструкторе класса или в метод.

Или вообще указатель сделать глобальным для всех объектов, где нибудь в файле с main().

Это сообщение отредактировал(а) SABROG - 10.4.2008, 15:39


--------------------
Национальная группа Russian Federation на QtCentre.
PM MAIL   Вверх
Mephisto
Дата 10.4.2008, 15:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Волкъ
***


Профиль
Группа: Завсегдатай
Сообщений: 1818
Регистрация: 27.8.2003
Где: Питер

Репутация: 1
Всего: 34



Цитата(SABROG @  10.4.2008,  16:35 Найти цитируемый пост)
Или вообще указатель сделать глобальным для всех объектов, где нибудь в файле с main().

 smile Я ьы не делал так, если честно. Вообще не пойму зачем и кому необходимо иметь ссылку на главную форму хоть убейте меня тут   smile 

Вот что-то врое главной формы:
Код

class MainWindow:QMainWindow{
Q_OBJECT
public slots:
       void showFindDialog(){
        FindDialog *findDlg = new FindDialog;
        connect(findDlg, SIGNAL(fndNext(bool, QString)), SLOT(slotFind(bool, QString)));
        if(findDlg->exec() == QDialog::Rejected) {
                        delete findDlg;
                        }
        };
        void slotFind(bool isSensitivity, QString TextToFind){/*Код который что-то ищет*/};
};

И собсвенно форма поиска:
Код

class FindDialog:QDialog{
Q_OBJECT
public:
       FindDialog();
public slots:
       void fN(){
          /*тут отправляем сигнал*/
          emit fndNext(true, QString("Найдем тратата"));
       }
signals:
        void fndNext(bool isSensitivity, QString TextToFind);
};


Добавлено @ 15:56
за разметку извиняйте, писал в окошке форумном, тяжело форматировать. :( Могут быть и описки.

Добавлено @ 15:56
Да, и обязательно сделать QMake!

Это сообщение отредактировал(а) Mephisto - 10.4.2008, 16:52
PM   Вверх
anatox91
Дата 10.4.2008, 15:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


программист-самоучка
**


Профиль
Группа: Участник
Сообщений: 699
Регистрация: 12.1.2008
Где: ++Украина.Крым++

Репутация: нет
Всего: 13



с примером Mephisto тоже самое... всегда вызывается функция nothing() при поиске...
сделал в точности как Mephisto:
FindDialog.h:
Код

public slots:
       void fn() { 
            bool b = caseSensitivity->isChecked();
            QString str = lineFind->text();
            emit fndNext(b, str); 
            }
signals:
        void fndNext(bool, QString&);


MainWindow.cpp
Код

void MainWindow::findNext() {
     FindDialog *findDlg = new FindDialog();
     connect(findDlg, SIGNAL(fndNext(bool, QString&)), this, SLOT(slotFind(bool, QString&)));
     if(findDlg->exec() == QDialog::Rejected) {
                        delete findDlg;
                        }
}
void MainWindow::slotFind(bool isSensitivity, QString& strFind) {
     bool result;
     if(!strFind.isEmpty()) {
                            if(isSensitivity) { 
                                              result = textArea->find(strFind, QTextDocument::FindCaseSensitively);
                                              if(!result) nothing();
                                               }
                            else { 
                                 result = textArea->find(strFind);
                                 if(!result) nothing();
                                 }
                                 }
     else emptyString(); 
}


может я где-то в if-else инструкциях напутал?...  smile 

мда.. походу точно где-то в инструкциях ошибка... потому что иногда находит то что нужно...

Это сообщение отредактировал(а) anatox91 - 10.4.2008, 16:45


--------------------

The code is the design ©

Sony VAIO VGN-FW480J

user posted image
PM MAIL ICQ   Вверх
Mephisto
Дата 10.4.2008, 16:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Волкъ
***


Профиль
Группа: Завсегдатай
Сообщений: 1818
Регистрация: 27.8.2003
Где: Питер

Репутация: 1
Всего: 34



У меня вот так вот работает:
Код

#include <qmainwindow.h>
#include <qwidget.h>
#include <qpushbutton.h>
#include <qapplication.h>
#include <qtextedit.h>
#include <qlayout.h>

class WorkArea:public QWidget{
Q_OBJECT
public:
  WorkArea(QWidget* parent = 0):QWidget(parent){
    pedit = new QTextEdit(this);
    QPushButton* pb = new QPushButton(this);
    QVBoxLayout* playout = new QVBoxLayout(this);
    connect(pb, SIGNAL(clicked()), SLOT(FindClicked()));
    pb->setText("Find");
    playout->addWidget(pedit);
    playout->addWidget(pb);
  }
  QTextEdit* pedit;
public slots:
  void FindClicked(){
    emit FindNext(true, QString("TT"));
  }
signals:
  void FindNext(bool isSensetive, QString TextToFind);
};

class frmMain:public QMainWindow{
Q_OBJECT
public:
  frmMain(QWidget* parent = 0, Qt::WindowFlags flags = 0):QMainWindow(parent, flags){
    pwa = new WorkArea(this);
    setCentralWidget(pwa);
    connect(pwa, SIGNAL(FindNext(bool, QString)), SLOT(Finder(bool, QString)));
    pwa->show();
  }
  WorkArea* pwa;
public slots:
  void Finder(bool isSensetive, QString TextToFind){
    if (isSensetive){
      pwa->pedit->find(TextToFind, QTextDocument::FindCaseSensitively);
    }else{
      pwa->pedit->find(TextToFind);
    }
  }
};

int main(int argc, char** argv){
  QApplication app(argc, argv);
  frmMain m;
  QObject::connect(&app, SIGNAL(lastWindowCloased()), &app, SLOT(quit()));
  m.show();
  return app.exec();
}

#include <main.moc>


anatox91, а ты курсор установил в начало текстового окошка? Потому как по умлочанию он только ищет в тексте после курсора! Чтоб в обратную сторону поискать нужно установить флаг соответствующий.
PM   Вверх
anatox91
Дата 10.4.2008, 16:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


программист-самоучка
**


Профиль
Группа: Участник
Сообщений: 699
Регистрация: 12.1.2008
Где: ++Украина.Крым++

Репутация: нет
Всего: 13



походу нет.. smile  а как его установить в начало?

и кстати что делает вот это:
Код

#include <main.moc>

?

Это сообщение отредактировал(а) anatox91 - 10.4.2008, 17:01


--------------------

The code is the design ©

Sony VAIO VGN-FW480J

user posted image
PM MAIL ICQ   Вверх
Mephisto
Дата 10.4.2008, 17:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Волкъ
***


Профиль
Группа: Завсегдатай
Сообщений: 1818
Регистрация: 27.8.2003
Где: Питер

Репутация: 1
Всего: 34



anatox91, у меня только один файл - main.cpp. Лень быол разносить по отдельным хидерам.
Чтобы скомпилилось, нужно так в конце написать. Ента сенкс Архимеду, подсказал что так мона. smile

Цитата(anatox91 @  10.4.2008,  17:56 Найти цитируемый пост)
а как его установить в начало?

Мышкой ткнуть как минимум  smile 

А вообще я бы сделал прямой поиск, в случае неудачи обратный. 
Т.е. поиск в два шага:
1) Ищешь что нужно, проверяешь резалт, если не нашел, то к шагу 2
2) Ищешь назад, проверяешь резалт, если не нашел, то таки ничего нет smile 
PM   Вверх
SABROG
Дата 10.4.2008, 17:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Hacker
****


Профиль
Группа: Завсегдатай
Сообщений: 2481
Регистрация: 18.9.2006

Репутация: 81
Всего: 91



Цитата

Writing Make Rules for Invoking moc
For anything but the simplest test programs, it is recommended that you automate running the moc. By adding some rules to your program's makefile, make can take care of running moc when necessary and handling the moc output.
We recommend using Trolltech's makefile generation tool, qmake, for building your makefiles. This tool generates a makefile that does all the necessary moc handling.
If you want to create your makefiles yourself, here are some tips on how to include moc handling.
For Q_OBJECT class declarations in header files, here is a useful makefile rule if you only use GNU make:
         moc_%.cpp: %.h
                 moc $(DEFINES) $(INCPATH) $< -o $@
If you want to write portably, you can use individual rules of the following form:
         moc_foo.cpp: foo.h
                 moc $(DEFINES) $(INCPATH) $< -o $@
You must also remember to add moc_foo.cpp to your SOURCES (substitute your favorite name) variable and moc_foo.o or moc_foo.obj to your OBJECTS variable.
Both examples assume that $(DEFINES) and $(INCPATH) expand to the define and include path options that are passed to the C++ compiler. These are required by moc to preprocess the source files.
While we prefer to name our C++ source files .cpp, you can use any other extension, such as .C, .cc, .CC, .cxx, and .c++, if you prefer.
For Q_OBJECT class declarations in implementation (.cpp) files, we suggest a makefile rule like this:
         foo.o: foo.moc

         foo.moc: foo.cpp
                 moc $(DEFINES) $(INCPATH) -i $< -o $@
This guarantees that make will run the moc before it compiles foo.cpp. You can then put
         #include "foo.moc"
at the end of foo.cpp, where all the classes declared in that file are fully known. 


Цитата

enum QTextDocument::FindFlag
flags QTextDocument::FindFlags
This enum describes the options available to QTextDocument's find function. The options can be OR-red together from the following list:

Constant
Value
Description
QTextDocument::FindBackward
0x00001
Search backwards instead of forwards.
QTextDocument::FindCaseSensitively
0x00002
By default find works case insensitive. Specifying this option changes the behaviour to a case sensitive find operation.
QTextDocument::FindWholeWords
0x00004
Makes find match only complete words.

The FindFlags type is a typedef for QFlags<FindFlag>. It stores an OR combination of FindFlag values.



--------------------
Национальная группа Russian Federation на QtCentre.
PM MAIL   Вверх
anatox91
Дата 10.4.2008, 17:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


программист-самоучка
**


Профиль
Группа: Участник
Сообщений: 699
Регистрация: 12.1.2008
Где: ++Украина.Крым++

Репутация: нет
Всего: 13



Mephisto, хорошо так и сделаю

SABROG, про QTextDocument::FindBackward я итак знал, а вот про мос спасибо, почитаю

еще раз всем большое спасибо!


--------------------

The code is the design ©

Sony VAIO VGN-FW480J

user posted image
PM MAIL ICQ   Вверх
SABROG
Дата 10.4.2008, 17:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Hacker
****


Профиль
Группа: Завсегдатай
Сообщений: 2481
Регистрация: 18.9.2006

Репутация: 81
Всего: 91



Цитата(anatox91 @ 10.4.2008,  17:20)
Mephisto, хорошо так и сделаю

SABROG, про QTextDocument::FindBackward я итак знал, а вот про мос спасибо, почитаю

еще раз всем большое спасибо!

Цитата

void QTextEdit::moveCursor ( QTextCursor::MoveOperation operation, QTextCursor::MoveMode mode = QTextCursor::MoveAnchor )
Moves the cursor by performing the given operation.
If mode is QTextCursor::KeepAnchor, the cursor selects the text it moves over. This is the same effect that the user achieves when they hold down the Shift key and move the cursor with the cursor keys.
This function was introduced in Qt 4.2.
See also QTextCursor::movePosition().



--------------------
Национальная группа Russian Federation на QtCentre.
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С/С++: Кроссплатформенное программирование, QT/Gtk+/wxWidgets"
JackYF
Любитель
  • В заголовке темы в квадратных скобках обозначьте используемую вами библиотеку, например: [QT],[GTK],[wx].
  • Если вопрос актуален только для некоторой версии библиотеки, либо, если вы пользуетесь не самой последней версией, укажите это. Например: [QT4], [GTK2].
  • Все начинающие изучать Qt - не забудьте зайти сюда.
  • Проставьте несколько ключевых слов темы, чтобы её можно было легче найти.
  • В вопросе укажите полную версию версию библиотеки, а также все дополнительные используемые программные пакеты.
  • Не забывайте пользоваться кнопкой "Код".
  • Телепатов на форуме нет! Задавайте чёткий, конкретный и полный вопрос. Указывайте полностью ошибки компилятора и компоновщика.
  • Новое сообщение должно иметь прямое отношение к тематике этого раздела. Флуд, флейм, оффтопик запрещены.
  • Категорически запрещается обсуждение вареза, "кряков", взлома программ и т.д.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, Любитель.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | С/С++: Кроссплатформенное программирование, Qt/Gtk+/wxWidgets | Следующая тема »


 




[ Время генерации скрипта: 0.0815 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.