Название: Проектирование MDI интерфейса Отправлено: NOX86 от Октября 27, 2009, 16:57 Новый вопрос:
В программе есть 2 разных типа окна для каждого свои тулбары и меню. Общие тулбары (сохранить открыть undo\redo) реализованы ка в офф примере qt (http://qt.nokia.com/doc/4.6/mainwindows-mdi.html). Каким образом включать\выключать принадлежащее к конкретному типу окна тулбары и меню? Уточню что в этих тулбарах находятся специфичные для _каждого_ окна экшены. Такой же вопрос нашёл тут (http://lists.trolltech.com/qt-interest/2001-01/thread00035-0.html), но тема и ответы не актуальны. Вопрос ниже решён: [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. --- ---------------------------- --- Подскажите архитектуру приложения при которой было бы возможно использование разных виджетов для разных типов текстовых документов Название: Re: Проектирование MDI интерфейса Отправлено: panAlexey от Октября 27, 2009, 17:53 Хороший вопрос.
Название: Re: Проектирование MDI интерфейса Отправлено: ildar от Октября 27, 2009, 18:19 Код: template<class T> ? Название: Re: Проектирование MDI интерфейса Отправлено: BRE от Октября 27, 2009, 18:31 Зачем использовать документ в качестве базового класса для виждета.
Виджет - это "мордочка", документ - это данные. Есть хороший пример, как это реализовать: QTextEdit + QTextDocument. Название: Re: Проектирование MDI интерфейса Отправлено: panAlexey от Октября 27, 2009, 18:45 Зачем использовать документ в качестве базового класса для виждета. да, но нет хорошего примера как MDI реализовать.Виджет - это "мордочка", документ - это данные. Есть хороший пример, как это реализовать: QTextEdit + QTextDocument. Хотя где-то видел... http://kde-apps.org/content/show.php/qmdilib?content=40721 Название: Re: Проектирование MDI интерфейса Отправлено: NOX86 от Октября 27, 2009, 19:35 видимо буду делать с идеологией has-a (а не is-a), т.е. MyWidget + QTextEdit (аналогично QTextEdit + QTextDocument). Документ нужен, чтоб иметь доступ к АПИ позволяющему редактировать текстовый документ. забыл добавить, MyWidget может состоять из 2х QTextEdit например.
Название: Re: Проектирование MDI интерфейса Отправлено: break от Октября 28, 2009, 01:01 Цитировать да, но нет хорошего примера как MDI реализовать. Никак не пойму как данная задача с MDI связана - если среди дочерних окошек куча разных html, rtf, plain text - разве они обязаны иметь общий интерфейс? Это же совсем разные вещи что там обобщить то можно и зачем?Название: Re: Проектирование MDI интерфейса Отправлено: NOX86 от Октября 28, 2009, 02:11 обобщить можно основные способности редактора (вставку, копирование, поиск и пр.) что как раз и нужно.
Название: Re: Проектирование MDI интерфейса Отправлено: NOX86 от Января 17, 2010, 20:28 Новый вопрос:
В программе есть 2 разных типа окна для каждого свои тулбары и меню. Общие тулбары (сохранить открыть undo\redo) реализованы ка в офф примере qt (http://qt.nokia.com/doc/4.6/mainwindows-mdi.html). Каким образом включать\выключать принадлежащее к конкретному типу окна тулбары и меню? Уточню что в этих тулбарах находятся специфичные для _каждого_ окна экшены. Такой же вопрос нашёл тут (http://lists.trolltech.com/qt-interest/2001-01/thread00035-0.html), но тема и ответы не актуальны. Название: Re: Проектирование MDI интерфейса Отправлено: asvil от Января 25, 2010, 21:35 Код: MainWindow::MainWindow() Возможно код немного не в тему. Я очень извиняюсь, что копирую прямо из qtcreator'а, но с одной стороны хочеться помочь или услышать критику кода, а с другой не хватает времени отредактировать для публики. И поле для редактирования сообщения неудобно маленькое. Или это я особенный через оперу пишу. Вообщем к делу. Если в файле главной формы (пр. MainWindow.ui) создать action c именем copyAction или просто copy, то данный action будет доступен в зависимости от того будет ли у виджета имеющего фокус мета-вызываемый (invokable или Q_SLOT) метод copy(). Недоделанная сторона данного метода. Доступность action для редактирования текста должна также зависеть от количества выделенного текста фокусного виджета. А также скользкое место данного метода. Точнее место, строгую логику которого я еще не продумал. Если отнаследовать какой-нибудь itemview и там определить метод pasteLines, то при редактировании таблицы фокус будут забирать делегаты. А pasteLines должен в свою очередь быть доступным даже при активном делегате. Поэтому, как вариант, проверять родителя фокусного виджета, и выставлять доступность необходимых action'сов. |