Отображение форм с использованием Tree в Qt - PullRequest
0 голосов
/ 18 октября 2011

Я создаю плагин Qt с несколькими формами.У меня есть основная форма, в которой слева от формы размещен виджет дерева.

Я хочу добавить элементы в это дерево, чтобы при нажатии на эти элементы загружалась соответствующая форма в той же форме.Но я хочу, чтобы виджет дерева был активным, чтобы я мог выбрать любую другую форму.

Мне удалось отобразить форму в главной форме, используя следующий код:

Form1 *myform;
myform=new Form1(this);
myform->show();

, где Form1 - это класс формы, которую я намереваюсь отобразить.Однако это также скрывает виджет дерева.И мне нужно сравнить строки элемента в дереве, по которому щелкают, чтобы отобразить соответствующую форму.

Может кто-нибудь помочь мне с этим, поскольку я очень новичок в программировании на Qt.

Спасибо

Ответы [ 2 ]

0 голосов
/ 18 октября 2011

ixM имеет хорошее предложение. Первым шагом, безусловно, должно быть использование макетов в главном окне - отделение дерева от остальной части окна, куда вы собираетесь поместить свою форму. Я бы предложил использовать сплиттер, потому что тогда пользователь может изменить размер двух половинок. Вы можете установить сплиттер в качестве основного виджета вашего CentralWidget в главном окне.

    QSplitter splitter = new QSplitter(CentralWidget);
    splitter->setOrientation(Qt::Horizontal);
    splitter->setHandleWidth(3);
    splitter->setChildrenCollapsible(false);

    MyTree= new QTreeWidget(splitter);  
    splitter->addWidget(MyTree);

Затем добавьте свой виджет дерева в сплиттер, который будет слева.

Следующим шагом является добавление виджета-заполнителя справа от вашего сплиттера. Мы также собираемся добавить макет внутри этого виджета. Этот макет очень важен, мы собираемся использовать его позже.

    QWidget WidgetRightSide = new QWidget(splitter);
    QVBoxLayout setupLayout= new QVBoxLayout(WidgetRightSide);
    setupLayout->setSpacing(0);
    setupLayout->setContentsMargins(0, 0, 0, 0);

Теперь на этом этапе мой ответ действительно отличается от предыдущего. Вы можете использовать QStackedWidget. Это, безусловно, вариант. Проблема в том, что вы должны создавать и загружать все свои формы в начале. Это использует намного больше памяти, и займет больше времени для запуска. Это не так плохо, если у вас 2-5 форм, но когда мы говорим о 20, 30 или более формах, это действительно ужасно.

Итак, что я бы предложил вместо этого, это то, что когда пользователь выбирает что-то в дереве, мы удаляем старую форму и добавляем вновь выбранную форму в этой точке.

Когда выбранный элемент в дереве изменяется, это то, что мы должны сделать.

Сначала удалите все элементы из ранее выделенной формы.

  QLayoutItem *_Item;
  while ((_Item = setupLayout->takeAt(0)))
    delete _Item;

Далее выясните, какую форму показывать дальше, и создайте ее.

  QWidget *ActiveSetupForm = NULL;

  if ( I need to load form 1)
  {
     ActiveSetupForm = new YourNewForm( WidgetRightSide);
  }
  else ...

И, наконец, добавьте вашу новую форму в наш макет.

   if(ActiveSetupForm)
   {
       setupLayout->addWidget(pActiveSetupForm);
   } 

Просто как примечание. Макеты сложно сделать вручную. Я настоятельно рекомендую вам использовать QtDesigner при создании форм. Это делает жизнь намного проще. Если вы хотите узнать больше об этом, перейдите по этой ссылке .

0 голосов
/ 18 октября 2011

Я не совсем понимаю, чего вы пытаетесь достичь, но фрагмент кода, который вы показываете, предполагает, что вы не используете макеты, предоставляемые Qt.

Если ваша цель состоит в том, чтобы иметь возможность динамически загружать форму в зависимости от элемента, который был нажат в дереве, вы можете достичь этого, имея макет (скажем, QHBoxLayout), куда вы вставите свое дерево и QStackedWidget , в котором вы можете «сохранить» каждую форму (используя addWidget ()) и выбрать, какую из них вы хотите отобразить, вызвав setCurrentIndex ().

...