crossplatform.ru

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

 
Ответить в данную темуНачать новую тему
> Виджет покидает пределы главного окна.
Danmerpro
  опции профиля:
сообщение 16.4.2012, 10:18
Сообщение #1


Студент
*

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

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




Репутация:   0  


Приветствую. Подскажите, пожалуйста.
В главном окне есть QTabWidget. В каждом из tab'ов есть QGridLayout. В этот QGridLayout добавляются видеовиджеты (класс VideoWidget, унаследован он QWidget, занимается отображением видео на основе libvlc). Есть возможность листать эти видеовиджеты(так как их больше, и все сразу отобразиться не могут). Очистка tab'а при листании или смене его происходит следующим образом - удаляются видеовиджеты, затем, когда надо, удаляется старый QGridLayout, создается новый и добавляются в него новые видеовиджеты. Иногда возникает баг следующего рода - видеовиджеты при листании оказываются не в tab'е, а вне главного окна, хотя в коде сначала виджет размещается менеджером компоновки на своем месте, а потом запускается проигрывание.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
wiz29
  опции профиля:
сообщение 16.4.2012, 12:19
Сообщение #2


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

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

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




Репутация:   12  


Скрины и куски кода не помешали бы ответе на ваш вопрос.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Danmerpro
  опции профиля:
сообщение 17.4.2012, 9:25
Сообщение #3


Студент
*

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

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




Репутация:   0  


Цитата(wiz29 @ 16.4.2012, 13:19) *
Скрины и куски кода не помешали бы ответе на ваш вопрос.

Вот, например размещение виджетов:
void Set::makeTwoSquare()
{
    QGridLayout *grid = new QGridLayout(this);
    grid -> setMargin(0);
    setLayout(grid);
    for( int i = 0; i < 2; i++)
    {
        for( int j = 0; j < 2; j++)
        {
            VideoWidget *v = new VideoWidget();
            grid->addWidget(v, i, j);
            videoList << v;
        }
    }
}

Вот запуск проигрывания:
void Set::countActiveAndPlay()
{
    const QList<Camera *> *currentList = stc.at(tp);
    int len = currentList -> length();
    activeCameras = (len < videoList.length()) ? len : videoList.length();
    if(buttonClicked && (activeCameras + lastCamNum[tp]) > len)
        activeCameras = len - lastCamNum[tp] - 1;
    QList<VideoWidget *>::iterator it = videoList.begin();
    for(int i =  0; i < activeCameras; i++, it++)
    {
        (*it) -> setCamera(currentList -> at(i));
        (*it) -> startPlay(VideoWidget::SMALLVIDEO);
    }
    it = videoList.begin();
    QList<VideoWidget *>::iterator end = videoList.end();
    while(it != end)
    {
        connect(*it,SIGNAL(bigSizeCall(VideoWidget*)),this,SLOT(bigVideo(VideoWidget*)));
        connect(*it, SIGNAL(camerasChanged(VideoWidget *, Camera *, bool)),
                this, SLOT(changeCameras(VideoWidget*, Camera*, bool)));
        it++;
    }
}

Заметил ещё такую ситуацию. В программе возможен drag&drop видеовиджетов между собой. Тогда они поменяются местами (вернее они останутся на месте, но url видеопотока для каждого поменяется). Допустим получилась такая ситуация: некоторые видеовиджеты вылезли из окна, некоторые нормально в окне. Я беру виджет, который в окне, и перетаскиваю его на то место, где должен находиться виджет, который вылез из окна (в данный момент оно пустое, виджет-то вылез). И drag&drop успешно происходит. То есть виджет, который вне окна, успешно ловит dropEvent. Получается, что програмно виджет находится там, где должен быть, но реальное его отображение и проигрывание видео идет где-то в "левом" месте. Может это косяк, связанный именно с libvlc, но поиском ничего внятного найти не смог.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
wiz29
  опции профиля:
сообщение 17.4.2012, 9:36
Сообщение #4


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

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

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




Репутация:   12  


1. А зачем каждый раз удалять QGridLayout? (вполне можно просто перегруппировать в том же компановщике)
2. Из приведенного кода видно только процесс создания виджета с компановщиком на 4 виджета.
3. Нужен код, который отвечает за перекомпановку виджетов, ведь в этом проблема, не так ли?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Danmerpro
  опции профиля:
сообщение 17.4.2012, 10:41
Сообщение #5


Студент
*

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

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




Репутация:   0  


1. Подумаю над этим. Есть много разных раскладок, 2*2, 4*4 и тп.
3. При перемещении косяков как раз не бывает. Косяки именно при листании.То есть происходит удаление того, что есть, заново создается компановка, размещаются в ней виджеты и запускается проигрывание. Написано всё вроде бы правильно, но почему иногда так происходит - непонятно.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

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


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




RSS Текстовая версия Сейчас: 15.1.2025, 17:39