Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Список суб-окон QMdiArea в QComboBox, Проблема обновления списка окон 
V
    Опции темы
loneybibi
  Дата 6.6.2011, 13:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Любитель
**


Профиль
Группа: Участник
Сообщений: 257
Регистрация: 28.5.2010
Где: Донецк (Украина)

Репутация: 3
Всего: 3



Доброго времени суток всем !  smile 
Есть класс на основе QComboBox для отображения списка окон QMdiArea.
Подскажите пожалуйста кто знает к чему прикрутить слот обновления этого списка или как отследить добавление или удаление дочернего окна в QMdiArea что бы обновлять список каждый раз когда это происходит !? 

Код

/* ---------------------------------- */
class WindowList:public QComboBox{
    Q_OBJECT
public:
    QMdiArea *mParent;
    WindowList(QWidget *parent=0):QComboBox(parent){
        mParent=static_cast<QMdiArea*>(parent);
        if(mParent->subWindowList().count()>0){
            setEnabled(true);
            for(int i=0;i<mParent->subWindowList().count();++i)
            {
                addItem(mParent->subWindowList().at(i)->windowTitle());
            }
        }
            else
            {
                setEnabled(false);
                addItem("[Нет открытых окон]");
            }
        connect(this,SIGNAL(currentIndexChanged(int)),this,SLOT(itemActivation(int)));

        /* К ЧЕМУ ЕГО ПРИКРУТИТЬ ?????? */
        connect(mParent->subWindowList(),this,SLOT(itemListRefresh()));

    }

public slots:
    void itemActivation(int index){
        mParent->setActiveSubWindow(mParent->subWindowList().at(index));
    }

    void itemListRefresh(){
        this->clear();
        if(mParent->subWindowList().count()>0){
            setEnabled(true);
            for(int i=0;i<mParent->subWindowList().count();++i)
            {
                addItem(mParent->subWindowList().at(i)->windowTitle());
            }
        }
            else
            {
                setEnabled(false);
                addItem("[Нет открытых окон]");
            }
    }
};
/* ---------------------------------- */



--------------------
Red Hat Fedora 17
Qt 4.8.1 (x64), GCC 4.4.3,
G++ 4.4.3, QtCreator 2.4.1
PM MAIL ICQ   Вверх
loneybibi
Дата 7.6.2011, 14:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Любитель
**


Профиль
Группа: Участник
Сообщений: 257
Регистрация: 28.5.2010
Где: Донецк (Украина)

Репутация: 3
Всего: 3



Сам справился! (:
Получилось вроде все как хотел.
Ниже код класса и исходники готовые:
Код


/* Список окон QMdiArea в выпадающем списке QComboBox.
   В качестве родителя необходимо указать QMdiArea.

   Пример использования:
        WindowList *newList=new WindowList(ui->mdiArea);
        ui->mainToolBar->addWidget(newList);

   Примечание!
   Все дочерние окна QMdiArea должны иметь аттрибут:
        setAttribute(Qt::WA_DeleteOnClose,true);

   В противном случае окна не будут удаляться после
   закрытия, а будут просто скрываться, так же они останутся
   в списке окон и при выборе окно будет снова показано.
*/

class WindowList:public QComboBox{
    Q_OBJECT
public:
    QMdiArea *mParent;
    WindowList(QWidget *parent=0):QComboBox(parent){
        mParent=static_cast<QMdiArea*>(parent);
        this->setMinimumSize(250,NULL);
        connect(this,SIGNAL(activated(int)),this,SLOT(itemActivation(int)));
        connect(mParent,SIGNAL(subWindowActivated(QMdiSubWindow*)),this,SLOT(itemListRefresh(QMdiSubWindow*)));
        itemListRefresh(NULL);
    }

public slots:
    void itemActivation(int index){
        if(index>-1){
            mParent->setActiveSubWindow(mParent->subWindowList().at(index));
            mParent->subWindowList().at(index)->show();
            }
    }

    int searchSubWindowIndex(QMdiSubWindow* subWindow){
        int r=-1;
        if(mParent->subWindowList().size()>0){
            for(int i=0;i<mParent->subWindowList().size();++i){
                if(mParent->subWindowList().at(i)==subWindow)
                {
                    r=i;
                }
            }
        }
        return®;
    }

    void itemListRefresh(QMdiSubWindow* subWindow){
        this->clear();
        if(mParent->subWindowList().count()>0){
            setEnabled(true);
            for(int i=0;i<mParent->subWindowList().count();++i)
            {
                addItem(mParent->subWindowList().at(i)->windowTitle());
            }
            this->setCurrentIndex(searchSubWindowIndex(subWindow));
        }
            else
            {
                setEnabled(false);
                addItem("[Нет открытых окон]");
            }

    }
};
/* ------------------------------------------------ */


Это сообщение отредактировал(а) loneybibi - 7.6.2011, 14:28

Присоединённый файл ( Кол-во скачиваний: 12 )
Присоединённый файл  test.zip 3,21 Kb


--------------------
Red Hat Fedora 17
Qt 4.8.1 (x64), GCC 4.4.3,
G++ 4.4.3, QtCreator 2.4.1
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С/С++: Кроссплатформенное программирование, QT/Gtk+/wxWidgets"
JackYF
Любитель
  • В заголовке темы в квадратных скобках обозначьте используемую вами библиотеку, например: [QT],[GTK],[wx].
  • Если вопрос актуален только для некоторой версии библиотеки, либо, если вы пользуетесь не самой последней версией, укажите это. Например: [QT4], [GTK2].
  • Все начинающие изучать Qt - не забудьте зайти сюда.
  • Проставьте несколько ключевых слов темы, чтобы её можно было легче найти.
  • В вопросе укажите полную версию версию библиотеки, а также все дополнительные используемые программные пакеты.
  • Не забывайте пользоваться кнопкой "Код".
  • Телепатов на форуме нет! Задавайте чёткий, конкретный и полный вопрос. Указывайте полностью ошибки компилятора и компоновщика.
  • Новое сообщение должно иметь прямое отношение к тематике этого раздела. Флуд, флейм, оффтопик запрещены.
  • Категорически запрещается обсуждение вареза, "кряков", взлома программ и т.д.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, Любитель.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | С/С++: Кроссплатформенное программирование, Qt/Gtk+/wxWidgets | Следующая тема »


 




[ Время генерации скрипта: 0.0384 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.