crossplatform.ru

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

Roland
  опции профиля:
сообщение 17.11.2011, 23:59
Сообщение #1


Новичок


Группа: Новичок
Сообщений: 6
Регистрация: 11.10.2011
Пользователь №: 2936

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




Репутация:   0  


Есть главное окно, в какотором расположен Toolbar и TabWidget c двумя вкладками.
На ToolBar я добавил свои Actions(действия) Undo, Redo.
В каждой вкладке TabWidget есть QTextEdit.

Задача такова: я пишу что-то в первом TextEdit и кнопки Undo и Redo на ToolBar соответственно функционируют для текущего QTextEdit.
Перехожу в другую вкладку, кнопки Undo и Redo начинают функционировать уже для другого QTextEdit.
Но кнопки функционируют криво.
Например:
Я написал в первом QTextEdit какой-то текст. Кнопка Undo активировалась. Затем, перешел во второй QTextEdit, кнопка Undo так и осталась активированой.

Несколько дней пытаюсь решить эту проблему. То ли баг в сигналах и слотах, то ли...

Итак, исходя из документации при переключении вкладок в TabWidget есть сигнал:
currentChanged(int);
Создаю свой слот для обработки данного сигнала.
changeDocument(int);
В конструкторе главного окна делаю connect.
connect(ui->tabWidget,SIGNAL(currentChanged(int)),this,SLOT(changeDocument(int)));


И сама реализация слота:
void MainWindow::changeDocument(int index)
{
if(editConnection)
{
disconnect(pTempEdit,SIGNAL(undoAvailable(bool)),ui->actionUndo,SLOT(setEnabled(bool)));
disconnect(ui->actionUndo,SIGNAL(triggered()),pTempEdit,SLOT(undo()));
disconnect(pTempEdit,SIGNAL(redoAvailable(bool)),ui->actionRedo,SLOT(setEnabled(bool)));
disconnect(ui->actionRedo,SIGNAL(triggered()),pTempEdit,SLOT(redo()));
disconnect(pTempEdit,SIGNAL(copyAvailable(bool)),ui->actionCopy,SLOT(setEnabled(bool)));
disconnect(ui->actionCopy,SIGNAL(triggered()),pTempEdit,SLOT(copy()));
disconnect(pTempEdit,SIGNAL(copyAvailable(bool)),ui->actionCut,SLOT(setEnabled(bool)));
disconnect(ui->actionCut,SIGNAL(triggered()),pTempEdit,SLOT(cut()));
editConnection = false;

}
pTempEdit = qobject_cast<QTextEdit*>(ui->tabWidget->currentWidget());
connect(pTempEdit,SIGNAL(undoAvailable(bool)),ui->actionUndo,SLOT(setEnabled(bool)));
connect(ui->actionUndo,SIGNAL(triggered()),pTempEdit,SLOT(undo()));
connect(pTempEdit,SIGNAL(redoAvailable(bool)),ui->actionRedo,SLOT(setEnabled(bool)));
connect(ui->actionRedo,SIGNAL(triggered()),pTempEdit,SLOT(redo()));
connect(pTempEdit,SIGNAL(copyAvailable(bool)),ui->actionCopy,SLOT(setEnabled(bool)));
connect(ui->actionCopy,SIGNAL(triggered()),pTempEdit,SLOT(copy()));
connect(pTempEdit,SIGNAL(copyAvailable(bool)),ui->actionCut,SLOT(setEnabled(bool)));
connect(ui->actionCut,SIGNAL(triggered()),pTempEdit,SLOT(cut()));
editConnection=true;
}

pTextEdit указатель на один из QTextEdit'ов
editConnection переменная, чтобы избежать критической ошибки, связанной с disconnect не соеденённых сигналов и слотов.

Пробовал добавить в if, чтобы обновлять активность кнопок, но после этого они вообще становятся неактивными и никак на сигналы и слоты не реагируют.
ui->actionUndo->setEnabled(false);
ui->actionRedo->setEnabled(false);


Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

Сообщений в этой теме


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


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


RSS Рейтинг@Mail.ru Текстовая версия Сейчас: 23.6.2025, 22:23