как в компоновщике пересобрать отображение виджета

вопросы по созданию программ с использованием возможностей библиотеки PHPQt5

Moderator: ArtMares

zazaka
User avatar
Ответственный глюкогенератор
 
Posts: 98
На форме с вертикальным компоновщиком расположены
- поле с выбором раздела
- виджет в котором куча кнопок в столбик
- затем виджет распорка

при смене раздела хочу в виджете содержащем кнопки  убрать старые кнопки и вставить новые  - как это сделать?


код приблизительно такой думал
Code:
// меню выбора фильтра раздела 
 $this->comboBox = new QComboBox;
        $this->add_teg_to_meny();//в comboBox добавим список разделов

        // виджет списка кнопок меню выбора темпла
        $this->menny_samples=new QWidget;
        $this->menny_samples->layout = new QVBoxLayout();//вертикальная компоновка
        $this->generate_meny();// добавляем нужные кнопки в зависимости от выбора меню

        ///// (временно) добавлена кнопка открытия раздела - переделать на отлов клика по QComboBox
        $button = new QPushButton;
        $button->text = 'Открыть';
        $button->onClicked = function() {
           
            // создадим НОВОЕ меню с семплами вместо старого
            $this->menny_samples->free;
            $this->menny_samples=new QWidget;
            $this->menny_samples->layout = new QVBoxLayout();//вертикальная компоновка
    
            $this->generate_meny($this->comboBox->currentText);
            //$this->page_L->layout->addWidget($this->menny_samples);
            
            $this->menny_samples->show();

        };

        // левая страничка
        $this->page_L = new QWidget;
        
        $this->page_L->layout = new QVBoxLayout();//вертикальная компоновка
        $this->page_L->layout->setContentsMargins(0,0,0,0);

        $this->page_L->layout->addWidget($this->comboBox);
        $this->page_L->layout->addWidget($button);
        $this->page_L->layout->addWidget($this->menny_samples);

        $this->page_L->layout->addWidget(new QWidget);// пустая распорка

но так или добавляет новые кнопки не удаляя старые или просто новое окошко открывается и кнопками
Унабле то лоад дынамиц либрары

ArtMares
User avatar
 
Posts: 72
Location: Москва
Вот как я пересобираю список проектов в PQStudio
Кнопки списка реализованы на основе обертки над QFrame в котором уже находятся все необходимые компоненты
Code:
    /**
     * Метод updateProjectList() - Обновляет список проектов
     */
    public function updateProjectsList() {
        if(!is_null($this->projectsList)) {
            $this->projectsList->layout->free();
            /** Проверяем существуют ли вложенные элементы в QFrame проектов */
            if(!empty($this->projectsList->children())) {
                /** Проходим по дочерним элементам и удаляем их */
                foreach($this->projectsList->children() as $item) $item->free();
            }
            $this->projectsList->layout = new QVBoxLayout;
            $this->projectsList->layout->setMargin(1);
            $this->projectsList->layout->setSpacing(1);
            /** Проверяем что полученные данные не являются пустой строкой */
            if(!empty($this->list)) {
                krsort($this->list);
                $n = count($this->list);
                /** Проходим по получившемуся массиву */
                foreach($this->list as $key => $project) {
                    /** Создаем кнопку для проекта */
                    if(($len = strlen($project['path'])) > 30) $project['path'] = substr($project['path'], 0, 20) . '...' . substr($project['path'], $len - 10, $len);
                    $lastProject = new ProjectsListBtn($this->projectsList, $project['name'], $project['path']);
                    /** Вешаем обработчик собития на кнопку удалить */
                    $lastProject->delete->onClicked = function ($sender) use ($key, $lastProject) {
                        $this->deleteProject($key);
                        $lastProject->free();
                        $n = count($this->list);
                        $this->projectsList->resize(($n > 8 ? 288 : 300), $n * 50);
                    };
                    $this->projectsList->layout->addWidget($lastProject);
                }
                $this->projectsList->resize(($n > 8 ? 288 : 300), $n * 50);
            }
        }
    }
PQStudio Development Progress: 75%
Version: 0.2

zazaka
User avatar
Ответственный глюкогенератор
 
Posts: 98
О так я всё верно сделал !  только команду free(); не верно написал)))

спс=))
Унабле то лоад дынамиц либрары

ArtMares
User avatar
 
Posts: 72
Location: Москва
[bquote=zazaka|/viewtopic.php?f=7&t=28&p=205#p205|31 мар 2016, 11:35]О так я всё верно сделал ! только команду free(); не верно написал)))

спс=))[/bquote]
Просто ты командой free() уничтожал сам QWidget. А нужно было уничтожить слой и дочерние элементы.

Но есть вопрос зачем пересобират каждый раз виджет? Не легче ли сделать через QStackedWidget и уже в него стакать готовые виджеты и вызывать необходимый тебе по клику кнопки
PQStudio Development Progress: 75%
Version: 0.2

zazaka
User avatar
Ответственный глюкогенератор
 
Posts: 98
Да я понимаю что так я убиваю не слой а сам виджет
но так я сразу и чищу все кнопки что были к нему привязаны автоматом? так как убил их родителя и там была едиснвенная ссылка на них

так проблема в том что нет готовых виджетов они самогенерируются .. интерактивно ))
Унабле то лоад дынамиц либрары

ArtMares
User avatar
 
Posts: 72
Location: Москва
[bquote=zazaka|/viewtopic.php?f=7&t=28&p=208#p208|31 мар 2016, 11:46]так проблема в том что нет готовых виджетов они самогенерируются .. интерактивно ))[/bquote]
То есть виджеты твои совершено не похожи друг на друга.
Если у них есть хоть какая то закономерность? Почему бы не сделать классы обертки как шаблоны для выджетов. И тогда можно это все стакать и вызывать. При этом ранее загруженный виджет тебе не придется заного генерировать

Интерактивнойсть, интерактивности рознь))
PQStudio Development Progress: 75%
Version: 0.2


Вернуться в Вопрошайка

Who is online
Users browsing this forum: No registered users and 8 guests