GtkVBox Qt эквивалент - PullRequest
       14

GtkVBox Qt эквивалент

0 голосов
/ 27 ноября 2010

В GTK раньше у меня было окно, в которое я ставил gtk_container_add () и являлся GtkVBox. Затем я мог упаковать виджеты, которые я хотел, в GtkVBox, чтобы они появлялись в окне.

Теперь я решил попробовать Qt, но не могу понять, как это сделать в Qt.

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

Однако Googling обнаружил только виджет Q3VBox, который, как мне кажется, нужен, но не рекомендуется, и QVBoxLayout.

Я пытался использовать QVBoxLayout, но он говорит мне, что я не могу изменить макет моего QMainWindow, так как у него уже есть макет.

Редактировать: Вот как я это делаю (это в конструкторе):

box = new QVBoxLayout;
setLayout(box)

Он хорошо компилируется, но во время выполнения выводит на консоль: QWidget::setLayout: Attempting to set QLayout "" on HCGWindow "", which already has a layout (HCGWindow - это окно моего приложения, которое является подклассом QMainWindow)

Итак, как я могу создать что-то похожее на GtkVBox в Qt, и если решением является Q3VBox, почему оно устарело и что еще я должен использовать?

Спасибо

Ответы [ 2 ]

2 голосов
/ 29 ноября 2010

На самом деле, вот рекомендуемое решение, предоставленное документацией Qt .

. Вы должны создать QVBoxLayout и добавить нужные виджеты в него.После этого вы устанавливаете макет на другом пустом виджете, а затем вы устанавливаете этот виджет в качестве центрального виджета подкласса QMainWindow.Вот пример в коде:

QWidget* widget1 = new QWidget(); // This could be anything subclassing QWidget.
QWidget* widget2 = new QWidget();

QVBoxLayout* layout = new QVBoxLayout();
layout->addWidget(widget1);
layout->addWidget(widget2);

QWidget* central = new QWidget(); // Only a containing QWidget.
central->setLayout(layout);

this->setCentralWidget(central);

Теперь у вашего подкласса QMainWindow должны быть два QWidget, расположенные в QVBoxLayout.

Обратите внимание, что я не дал ни одного родителякто-нибудь.Вы могли бы сделать это, но когда вы вызываете addWidget или setCentralWidget, владение виджетом (и макетом) передается содержащему классу.

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

Наконец, обратите внимание, что QMainWindow - исключение и, насколько я знаю, единственный класс с setCentralWidgetкак метод.Если вы попытаетесь создать подкласс QWidget, вы сможете использовать setLayout (как показано в примере выше).

Надеюсь, это поможет.

0 голосов
/ 27 ноября 2010

Попытайтесь создать экземпляр QVBoxLayout, добавьте в него свои виджеты и добавьте (не заменяйте) этот макет в макет главного окна.

Примечание. Класс QLayout не имеет члена addLayout, но у подклассов есть один.

Сначала вы должны получить и запомнить имя класса макета главного окна:

qDebug(this.layout()->objectName);

Затем добавьте свой QVBoxLayout к макету окна:

dynamic_cast<YourWindowLayoutClass>(
    this.layout())->addLayout(your_qvboxlayout_object);

Надеюсь, это будет работать.

...