crossplatform.ru

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

> Сегфолт при смене центрального виджета QMainWindow
Andrewshkovskii
  опции профиля:
сообщение 16.2.2009, 13:17
Сообщение #1


Активный участник
***

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

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




Репутация:   1  


Есть у меня QMainWindow. в нем отображается QWidget(MainWidget), c 3мя кнопочками. 1-ая кнопочка - Делает центральным (setCentraWidget) ещё один QWindget(Test1Widget). в этом виджите 2 кнопочки, одна не активна пока-что, другая должна возвращать фокус на MainWidget. делаю я это так :
описываю слот :
void ColorTest::BackToMainWindow()
{
    this->setCentralWidget(MainWidget);// this - указатель на мой QMainWindow
}


и соединяю с сигналом :

void ColorTest::SetConnectionsForTest1()
{
    //connect(SubmitAnswerTest,SIGNAL(clicked()),)
    connect(AbortTest1Button,SIGNAL(clicked()),this,SLOT(BackToMainWindow()));
}


Но при нажатии кнопочки AbotTest1Button - приложение завершается с ошибкой. В чем проблема?Ведь я менял центральный на test1Widget без проблем, а обратно - фиг. Может надо закрывать не "централизованные" виджеты?Пробывал - тоже самое.. в чем может быть проблема?

Сообщение отредактировал Litkevich Yuriy - 16.2.2009, 13:29
Причина редактирования: вместо параметра C++ используй cpp (англ.)
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
2 страниц V   1 2 >  
Начать новую тему
Ответов (1 - 9)
Andrewshkovskii
  опции профиля:
сообщение 16.2.2009, 14:00
Сообщение #2


Активный участник
***

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

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




Репутация:   1  


void QMainWindow::setCentralWidget ( QWidget * widget )
Sets the given widget to be the main window's central widget.
Note: QMainWindow takes ownership of the widget pointer and deletes it at the appropriate time.
See also centralWidget().

.. Я так понимаю, вот эта строка :
".. of the widget pointer and deletes it at the appropriate time. " все и объясняет..как жеж быть?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 16.2.2009, 14:14
Сообщение #3


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

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

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




Репутация:   94  


а зачем тебе вообще менять центральный виджет?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Andrewshkovskii
  опции профиля:
сообщение 16.2.2009, 14:15
Сообщение #4


Активный участник
***

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

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




Репутация:   1  


Ну есть центральный виджет, в нем 2 кнопочки :
Тест 1
Тест 2
Выход

При нажатии Тест 1 в главном окне меняется виджет для этого теста. в нем будет QPaintDevice, 3 слайдера, 2 кнопочки.
1 - Ответить
2 - Назад в главное меню.
Можно конечно сделать через отдельные виджеты каждое окошко..но как-то я хотел сделать вот так:)

Сообщение отредактировал Andrewshkovskii - 16.2.2009, 14:17
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 16.2.2009, 14:17
Сообщение #5


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

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

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




Репутация:   94  


Цитата(Andrewshkovskii @ 16.2.2009, 17:15) *
Ну есть центральный виджет, в нем 2 кнопочки :
и что? а центральный виджет-то зачем меняешь, какова цель?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Andrewshkovskii
  опции профиля:
сообщение 16.2.2009, 14:20
Сообщение #6


Активный участник
***

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

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




Репутация:   1  


Я нечайно там ctrl+Enter нажал, привыч перевода новой строки в qip)) там исправлено, посмотри.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 16.2.2009, 14:20
Сообщение #7


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

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

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




Репутация:   94  


поставь центральный виджет, на панель инструментов главного окна помести навигационные кнопки, а на центральный виджет положи стэк виджетов, на каждую станицу стэка положи связанное с конкретным тестом содержимое. Кнопками навигации будешь переключать страницы стэка виджетов.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Andrewshkovskii
  опции профиля:
сообщение 16.2.2009, 14:22
Сообщение #8


Активный участник
***

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

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




Репутация:   1  


То есть решение попроще отсутствует?..
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 16.2.2009, 16:08
Сообщение #9


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

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

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




Репутация:   94  


Цитата(Andrewshkovskii @ 16.2.2009, 17:22) *
То есть решение попроще отсутствует?..
проще уже некуда
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 16.2.2009, 17:10
Сообщение #10


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

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

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




Репутация:   94  


можешь и без панели инструментов:
в качестве центрального виджета ставишь стэк виджетов (QStackedWidget), на него свои кнопки и прочее, кнопки соединяешь с картой сигналов (QSignalMapper), а его сигнал со слотом смены страниц стэка виджетов:
// ====== в объявлении класса главного окна ======
QStackedWidget *mainWgt;
QWidget *page1;
QWidget *page2;
QPushButton *btn1;
QPushButton *btn2;
QSignalMapper *signalMapper;
// ========================

// ====== в конструкторе главного окна ======
signalMapper = new QSignalMapper(this);
mainWgt = new QStackedWidget();
setCentralWidget(mainWgt);

// Первая страница
page1 = new QWidget();
btn1 = new QPushButton(page1);
connect(btn1, SIGNAL(clicked()), signalMapper, SLOT(map()));
signalMapper->setMapping(btn1, 2); // 2- номер страницы в стеке виджетов на которую нужно перейти

// вторая страница
page2 = new QWidget();
btn2 = new QPushButton(page2);
connect(btn1, SIGNAL(clicked()), signalMapper, SLOT(map()));
signalMapper->setMapping(btn2, 1); // 1- номер страницы в стеке виджетов на которую нужно перейти


stackedWidget->addWidget(page2);
stackedWidget->addWidget(page1);
connect(signalMapper, SIGNAL(mapped(int)),
        mainWgt,         SIGNAL(setCurrentIndex(int)));
// ========================
помоему все просто
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

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


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




RSS Текстовая версия Сейчас: 29.11.2024, 6:51