Russian Qt Forum
Сентябрь 30, 2024, 18:23 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Не могу достучаться до родительского виджета!  (Прочитано 6111 раз)
Martiro
Гость
« : Май 14, 2009, 13:20 »

Такая ситуация...
Приложение построено на базе MDI.
При открытии документа создается дочернее окно на workspace (описанное в отдельном классе).
На дочернем окне лежит виджет, который тоже описан в отдельном классе. В какой-то момент необходимо некоторое значение из этого виджета передать в главную форму на statusbar.

Создание statusbar в MainWindow.cpp:
Код
C++ (Qt)
sbMain = new QStatusBar(this);
lbMessage = new QLabel(this);
sbMain->addWidget(lbMessage, 1);
 

Отдаю значение из виджета следующим образом:
Код
C++ (Qt)
#include "mainwindow.h"
...
void BiContent::mousePressEvent(QMouseEvent * me)
{
  ((MainWindow *)((DocWindow *)parent())->parent())->lbMessage->setText("Checking...");
}
В данном месте происходит Core dump...  Грустный
Что интересно, если вызывать функцию главного окна
Код
C++ (Qt)
((MainWindow *)((DocWindow *)parent())->parent())->setStatusMessage("Checking...");
сообщение отсылается, но (!), если функция в главном окне такая:
Код
C++ (Qt)
void MainWindow::setStatusMessage(QString str)
{
  qDebug(str);
}
Консоль текст печатает. А если так:
Код
C++ (Qt)
void MainWindow::setStatusMessage(QString str)
{
  lbMessage->setText(str);
}
Опять вылетает с Core dump!!!  Непонимающий
Помогите. Смеющийся
Записан
pastor
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 2901



Просмотр профиля WWW
« Ответ #1 : Май 14, 2009, 13:34 »

Покажи MainWindow.cpp\MainWindow.h
Записан

Integrated Computer Solutions, Inc. (ICS)
http://www.ics.com/
Martiro
Гость
« Ответ #2 : Май 14, 2009, 13:50 »

Основные функции:
MainWindow.cpp
Код
C++ (Qt)
#include "frMain.h"
 
//******************************************************
//   Constructior
//******************************************************
MainWindow::MainWindow (QWidget *pwgt/* = 0*/, const char * pszName /*= 0*/)
: QMainWindow (pwgt, pszName)
{
  ...
  ...
sbMain = new QStatusBar (this);
sbMain->setAcceptDrops(false);
 
lbMessage = new QLabel(this);
lbMessage->setLineWidth(0);
lbMessage->setMidLineWidth(0);
lbMessage->setFixedHeight(fontMetrics().height()+4);
lbMessage->setMinimumWidth(160);
 
sbMain->addWidget(lbMessage, 1);
 
m_pws = new QWorkspace (this);
m_pws->setScrollBarsEnabled(true);
m_pws->setBackgroundColor(Qt::darkBlue);
setCentralWidget(m_pws);
mnMenu = new QMenuBar(this);
mnMenu->setAcceptDrops(false);
 
connect(m_pws, SIGNAL(windowActivated(QWidget *)), SLOT(windowActivated(QWidget *)));
 
 
createActions();
createMenus();
createToolbars();
 
id =0;
}
...
...
//******************************************************
//  Open Doc Window
//******************************************************
void MainWindow::addClassForm(QString fileName, int i)
{
   QApplication::setOverrideCursor( QCursor(Qt::WaitCursor) );
 
   if (i == 0)
   {
ImgFrame * dwImage1 = new ImgFrame(m_pws, 0, 0, i);
dwImage1->setCaption(fileName);
dwImage1->openImage(fileName);
dwImage1->showMaximized();
   }
   if (i == 2  || i == 1)    
   {
mapForm * dwImage1 = new mapForm(m_pws, 0, 0, i);
if (dwImage1->typeForm != i)
   dwImage1->typeForm = i;
dwImage1->setCaption(fileName);
dwImage1->selectMap(fileName);
dwImage1->showMaximized();
   }
   QApplication::restoreOverrideCursor();
}
...
...
 

MainWindow.h
Код
C++ (Qt)
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
 
#include <qmainwindow.h>
#include <qworkspace.h>
#include <qtextcodec.h>
#include <qaction.h>
#include <qpopupmenu.h>
#include <qmenubar.h>
#include <qtoolbar.h>
#include <qtoolbutton.h>
#include <qstatusbar.h>
 
#include "cl_docwindow.h"
 
class QWorkspace;
class DocWnd;
 
 
class MainWindow: public QMainWindow
{
   Q_OBJECT
public:
   MainWindow (QWidget *pwgt = 0, const char * pszName = 0);
 
   QStatusBar *sbMain;
   QLabel *lbMessage, *lbCoords, *lbStatusScale;
private:
   QWorkspace * m_pws;
   void addClassForm(QString fileName, int i);
public:
   void setStatusMessage(QString str);
 
Записан
lit-uriy
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3880


Просмотр профиля WWW
« Ответ #3 : Май 14, 2009, 15:08 »

а с чего ради ты родителю насильно, что-то суёшь?
Пошли сигнал. А вродителе соедени сигнал с соответствующим слотом.
Записан

Юра.
Martiro
Гость
« Ответ #4 : Май 14, 2009, 15:34 »

никогда своих собственных сигналов не писал... хотел как-то без этого...
Записан
lit-uriy
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3880


Просмотр профиля WWW
« Ответ #5 : Май 14, 2009, 15:39 »

>>никогда своих собственных сигналов не писал... хотел как-то без этого...
сигнал - всего лишь объявление функции.
В объявлении класса BiContent пишешь:
Код
C++ (Qt)
signals:
void myMousePress(QString str);
 
в обработчике события мыша:
Код
C++ (Qt)
void BiContent::mousePressEvent(QMouseEvent * me)
{
emit myMousePress("Checking...");
}
 
Ну а в главном окне, или где тебе нужно, делаешь свой слот с такой же сигнатурой (т.е. myClot(QString str) )  и соеденяешь сигнал со слотом
« Последнее редактирование: Май 14, 2009, 15:42 от lit-uriy » Записан

Юра.
Martiro
Гость
« Ответ #6 : Май 14, 2009, 15:46 »

А коннект как в родителе прописывать?
Код
C++ (Qt)
connect(wgtContent, SIGNAL(myMousePress(QString str)), this, SLOT(setTextInLabel(QString str)));
Типо того? Правильно?
Записан
lit-uriy
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3880


Просмотр профиля WWW
« Ответ #7 : Май 14, 2009, 15:53 »

>>Правильно?
Нет!
Имена аргументов у сигналов и слотов, в функции connect, НЕ указывают!
См. Асистент, описание функции QObject::connect
« Последнее редактирование: Май 14, 2009, 15:57 от lit-uriy » Записан

Юра.
Martiro
Гость
« Ответ #8 : Май 14, 2009, 15:55 »

Ясно. Поглядим.
И еще вопрос...
Если таким образом реализовать, то нигде по памяти сигналы путаться не будут, если у меня несколько дочерних окон?
Записан
lit-uriy
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3880


Просмотр профиля WWW
« Ответ #9 : Май 14, 2009, 16:05 »

>>то нигде по памяти сигналы путаться не будут, если у меня несколько дочерних окон?
ты связываешь конкретный сигнал, конкретного объекта со стольже конкретной точкой назначения. Если сам ни чего не напутаешь, то всё будет путём.

П.С. твоя здоровенная картинка в подписи, не интересна, но занимает много места и недостаточно быстро загружается.
Записан

Юра.
ритт
Гость
« Ответ #10 : Май 14, 2009, 17:10 »

[off]не согласен - картинка интересна...хотя бы даунлоадом Улыбающийся
но картинку попросил бы убрать - действительно, раздражает...[/off]
Записан
Martiro
Гость
« Ответ #11 : Май 15, 2009, 07:49 »

Спасибо всем. Замечания учту. Улыбающийся
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.825 секунд. Запросов: 23.