Russian Qt Forum
Июля 03, 2025, 08:41 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Проектирование MDI интерфейса  (Прочитано 7116 раз)
NOX86
Гость
« : Октября 27, 2009, 16:57 »

Новый вопрос:
В программе есть 2 разных типа окна для каждого свои тулбары и меню. Общие тулбары (сохранить открыть undo\redo) реализованы ка в офф примере qt. Каким образом включать\выключать принадлежащее к конкретному типу окна тулбары и меню? Уточню что в этих тулбарах находятся специфичные для _каждого_ окна экшены.

Такой же вопрос нашёл тут, но тема и ответы не актуальны.

Вопрос ниже решён:
[SLOVED]
Хотелось бы использовать различные виджеты (QTextEdit,  QScintilla, MyWidget) для разных типов текстовых документов, например QTextEdit для простого текста, QScintilla для кода MyWidget для моих файлов (Причём хотелось бы использовать АПИ QTextEdit в других виджетах для работы с текстом).

--- Моя неудачная архитектура ---
 При реализации натыкаюсь на грабли:
Document - интерфейс с чистыми виртуальными функцями
class MyWidget : public QPlainTextEdit, public Document{};
 
QMdiSubWindow *subWindow = mdiArea->addSubWindow(new MyWidget(this));
Document *doc = dynamic_cast<Document *>(subWindow->widget());

Все хорошо, но к объекту Document неприменима система сигналов и слотов (невозможно использовать сигнал modificationChanged() ) т.к. он не наследует QObject. И этого делать нельзя - MyWidget не может наследовать от 2х объектов  наследующих QObject.
--- ---------------------------- ---

Подскажите архитектуру приложения при которой было бы возможно использование разных виджетов для разных типов текстовых документов
« Последнее редактирование: Января 17, 2010, 19:29 от NOX86 » Записан
panAlexey
Гипер активный житель
*****
Offline Offline

Сообщений: 865

Акцио ЗАРПЛАТА!!!!! :(


Просмотр профиля
« Ответ #1 : Октября 27, 2009, 17:53 »

Хороший вопрос.
Записан

Win Xp SP-2, Qt4.3.4/MinGW. http://trdm.1gb.ru/
ildar
Гость
« Ответ #2 : Октября 27, 2009, 18:19 »

Код:
template<class T>
class Document : public T {
....
};

class mywidget : public Document<QPlainTextEdit>  {
...
};

?
Записан
BRE
Гость
« Ответ #3 : Октября 27, 2009, 18:31 »

Зачем использовать документ в качестве базового класса для виждета.
Виджет - это "мордочка", документ - это данные.
Есть хороший пример, как это реализовать: QTextEdit + QTextDocument.
Записан
panAlexey
Гипер активный житель
*****
Offline Offline

Сообщений: 865

Акцио ЗАРПЛАТА!!!!! :(


Просмотр профиля
« Ответ #4 : Октября 27, 2009, 18:45 »

Зачем использовать документ в качестве базового класса для виждета.
Виджет - это "мордочка", документ - это данные.
Есть хороший пример, как это реализовать: QTextEdit + QTextDocument.
да, но нет хорошего примера как MDI реализовать.
Хотя где-то видел...
http://kde-apps.org/content/show.php/qmdilib?content=40721
Записан

Win Xp SP-2, Qt4.3.4/MinGW. http://trdm.1gb.ru/
NOX86
Гость
« Ответ #5 : Октября 27, 2009, 19:35 »

видимо буду делать с идеологией has-a (а не  is-a), т.е. MyWidget + QTextEdit (аналогично QTextEdit + QTextDocument). Документ нужен, чтоб иметь доступ к АПИ позволяющему редактировать текстовый документ. забыл добавить, MyWidget может состоять из 2х QTextEdit например.
Записан
break
Гипер активный житель
*****
Offline Offline

Сообщений: 846


Просмотр профиля
« Ответ #6 : Октября 28, 2009, 01:01 »

Цитировать
да, но нет хорошего примера как MDI реализовать.
Никак не пойму как данная задача с MDI связана - если среди дочерних окошек куча разных html, rtf, plain text - разве они обязаны иметь общий интерфейс? Это же совсем разные вещи что там обобщить то можно и зачем?
Записан
NOX86
Гость
« Ответ #7 : Октября 28, 2009, 02:11 »

обобщить можно основные способности редактора (вставку, копирование, поиск и пр.) что как раз и нужно.
Записан
NOX86
Гость
« Ответ #8 : Января 17, 2010, 20:28 »

Новый вопрос:
В программе есть 2 разных типа окна для каждого свои тулбары и меню. Общие тулбары (сохранить открыть undo\redo) реализованы ка в офф примере qt. Каким образом включать\выключать принадлежащее к конкретному типу окна тулбары и меню? Уточню что в этих тулбарах находятся специфичные для _каждого_ окна экшены.

Такой же вопрос нашёл тут, но тема и ответы не актуальны.
Записан
asvil
Гость
« Ответ #9 : Января 25, 2010, 21:35 »

Код:
MainWindow::MainWindow()
{
connect(qApp, SIGNAL(focusChanged(QWidget*,QWidget*))
, this, SLOT(focusChanged(QWidget*,QWidget*)));
}

void checkActionForWidget(QWidget *wdg, QAction *action)
{
QString signature = QString(action->objectName()).remove("Action");
signature += "()";
QByteArray methodName = QMetaObject::normalizedSignature(signature.toLatin1());
int methodId;
if ((methodId = wdg->metaObject()->indexOfMethod(methodName)) != -1) {
action->setEnabled(true);
} else {
action->setEnabled(false);
}
}

void MainWindow::focusChanged(QWidget* old, QWidget* now)
{
Q_UNUSED(old);
if (!now)
return ;

//QMetaMethod method;
checkActionForWidget(now, ui->copyAction);
checkActionForWidget(now, ui->cutAction);
checkActionForWidget(now, ui->pasteAction);
}

void MainWindow::actionTriggered()
{
QAction *action = qobject_cast<QAction *>(sender());

QWidget *now = qApp->focusWidget();
QMetaMethod method;
QString signature = QString(action->objectName()).remove("Action");
signature += "()";
QByteArray methodName = QMetaObject::normalizedSignature(signature.toLatin1());
int methodId;
if ((methodId = now->metaObject()->indexOfMethod(methodName)) != -1) {
method = now->metaObject()->method(methodId);
method.invoke(now);
}
}

Возможно код немного не в тему.
Я очень извиняюсь, что копирую прямо из qtcreator'а, но с одной стороны хочеться помочь или услышать критику кода, а с другой не хватает времени отредактировать для публики. И поле для редактирования сообщения неудобно маленькое. Или это я особенный через оперу пишу.
Вообщем к делу. Если в файле главной формы (пр. MainWindow.ui) создать action c именем copyAction или просто copy, то данный action будет доступен в зависимости от того будет ли у виджета имеющего фокус мета-вызываемый (invokable или Q_SLOT) метод copy().
Недоделанная сторона данного метода. Доступность action для редактирования текста должна также зависеть от количества выделенного текста фокусного виджета.
А также скользкое место данного метода. Точнее место, строгую логику которого я еще не продумал. Если отнаследовать какой-нибудь itemview и там определить метод pasteLines, то при редактировании таблицы фокус будут забирать делегаты. А pasteLines должен в свою очередь быть доступным даже при активном делегате. Поэтому, как вариант, проверять родителя фокусного виджета, и выставлять доступность необходимых action'сов.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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