crossplatform.ru

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

 
Ответить в данную темуНачать новую тему
> QTextEdit + Tab Widget + ToolBar, сигналы и слоты
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);


Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
wiz29
  опции профиля:
сообщение 18.11.2011, 10:58
Сообщение #2


Старейший участник
****

Группа: Участник
Сообщений: 600
Регистрация: 7.7.2010
Из: Санкт-Петербург
Пользователь №: 1866

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




Репутация:   12  


Цитата(Roland @ 18.11.2011, 0:59) *
кнопка Undo так и осталась активированой

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->widget(index));

        connect(pTempEdit,SIGNAL(undoAvailable(bool)),ui->actionUndo,SLOT(setEnabled(bool)));
        connect(ui->actionUndo,SIGNAL(triggered()),pTempEdit,SLOT(undo()));
        ui->actionUndo->setEnabled(pTempEdit->document()->availableUndoSteps());

        connect(pTempEdit,SIGNAL(redoAvailable(bool)),ui->actionRedo,SLOT(setEnabled(bool)));
        connect(ui->actionRedo,SIGNAL(triggered()),pTempEdit,SLOT(redo()));
        ui->actionRedo->setEnabled(pTempEdit->document()->availableRedoSteps());


        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;
}


Сообщение отредактировал wiz29 - 18.11.2011, 11:21
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

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


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




RSS Текстовая версия Сейчас: 16.2.2025, 21:12