LINUX.ORG.RU

Qt, QWidget на QMainWindow. Нужно. А больше ничего не нужно

 


0

1

Что-то QtDesigner заставляет меня грустить, а *.ui файл и вовсе сердит.
Мне нужно, чтобы на QMainWindow был лишь один QWidget, габариты которого равны габаритам QMainWindow. Собственно всё.
Киньте в меня, пожалуйста, ссылкой где разжёвано как это сделать программно (без дизайнеров, *.ui и прочей шелухи).

★★☆

Без статус-бара и прочей фигни или что?

Stil ★★★★★
()

Мне нужно, чтобы на QMainWindow был лишь один QWidget, габариты которого равны габаритам QMainWindow. Собственно всё.

QMainWindow — это QWidget с меню, тулбаром и прочим. Просто используй обычный QWidget.

Киньте в меня, пожалуйста, ссылкой где разжёвано как это сделать программно (без дизайнеров, *.ui и прочей шелухи).

http://doc.qt.io/qt-5/qmainwindow.html

http://doc.qt.io/qt-5/qwidget.html

anonymous
()
Ответ на: комментарий от anonymous

Просто используй обычный QWidget.

И действительно, минимальный пример вполне себе работает:

#include <QApplication>
#include <QPushButton>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    QWidget w;
    QPushButton pb("Halo", &w);
    w.show();

    return a.exec();
}

А зачем тогда QWindow нужен?

nezamudich ★★
()
Ответ на: комментарий от Stahl

Не должно такого происходить, вроде бы. Чтобы видгет растягивался по окну, самый короткий путь — это пропихнуть этот видгет без родителей:

#include <QApplication>
#include <QPushButton>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    QPushButton pb("Halo");
    pb.show();

    return a.exec();
}

Более длинный путь — это мутить свой колхозный QWidget, который будет по-своему реагировать на resizeEvent. Но зачем так делать — хз:

#include <QApplication>
#include <QPushButton>
#include <QResizeEvent>

class MyWidget : public QWidget
{
public:
    MyWidget(QWidget *parent = 0);
private:
    void resizeEvent(QResizeEvent *);
};

MyWidget::MyWidget(QWidget *parent) : QWidget(parent)
{
}

void MyWidget::resizeEvent(QResizeEvent *e)
{
    QWidget *child = this->findChild<QWidget *>("", Qt::FindDirectChildrenOnly);
    child->resize(e->size());
}

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    MyWidget w;
    QPushButton pb("Halo", &w);
    w.show();

    return a.exec();
}

Ещё есть куча способов почесать левое ухо правой ногой.

P.S. Я сам в qt не очень, критика приветствуется.

nezamudich ★★
()
Ответ на: комментарий от NoMasters

Вот прямо по твоей ссылке и написано, зачем оно нужно.

По той ссылке нопейсано, что такое QWindow, а не зачем оно. Хоть как-то тема раскрыта вот здесь, но и то мутновато.

nezamudich ★★
()
Ответ на: комментарий от nezamudich

Хоть как-то тема раскрыта вот здесь, но и то мутновато.

В смысле мутновато? Отличный ответ.

Stil ★★★★★
()
Ответ на: комментарий от Kosyak

Ответь на простой вопрос: почему нет лейаута, растягивающего один видгет по всей доступной площади? Потом будешь про говно вещать.

nezamudich ★★
()
Ответ на: комментарий от nezamudich

Q*BoxLayout и QGridLayout растянут один виджет по всей доступной полощади.

Kosyak ★★★★
()
Ответ на: комментарий от Stahl

А, я криво прочитал его сообщения, заметил только что он свой QWidget писать.

Да, можно использовать виджет напрямую. Когда виджет без родителей, у него устанавливается флаг (Qt::windowFlags) Qt::Window.

Kosyak ★★★★
()

если я вас правильно понял

В конструкторе наследника QMainWindow:

QWidget *workspace = new QWidget(this);
setCentralWidget(workspace);
QGridLayout * grid = new QGridLayout(workspace);
Или сразу использовать QWidget вместо QMainWindow

tyro33
()
Ответ на: если я вас правильно понял от tyro33

Или сразу использовать QWidget вместо QMainWindow

Так и надо. На момент составления вопроса я не понимал, что можно обходиться и без QMainWindow.

Stahl ★★☆
() автор топика
Ответ на: комментарий от nezamudich

QMainWindow::setCentralWidget(QWidget*)


Если не QMainWindow, а просто виджет, то вот так:

QWidget* w = new QWidget();
QHBoxLayout* mainLayout = new QHBoxLayout();
w->setLayout(mainLayout);

QPushButton* b = new QPushButton(«Bla-Bla»);
mainLayout->addWidget(b);

trex6 ★★★★★
()
Ответ на: комментарий от trex6

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

При этом замечу, что нет специального лэйаута для одного растягивающегося ребёнка. Просто нет. Вопрос: почему? Правильный ответ: потому что лэйаут тогда не нужен.

nezamudich ★★
()
Ответ на: комментарий от trex6

QMainWindow::setCentralWidget(QWidget*)

Вот, кстати, спасибо, совсем забыл про setCentralWidget.

nezamudich ★★
()
Ответ на: комментарий от nezamudich

Просто сравните ваш костыль с виджетом-наследником и код, где используется лейаут.

Если вы все еще считаете, что «лейауты созданы для чего-то другого», то мне жаль вас и ваших пользователей.

trex6 ★★★★★
()
Ответ на: комментарий от trex6

костыль с виджетом-наследником

Это не костыль. Представь себе программу с одним лишь виджетом. А теперь представь себе полезную программу с одним лишь стандартным виджетом.
Так что, в случае единственного виджета, его всё равно нужно будет изменять.

Stahl ★★☆
() автор топика
Ответ на: комментарий от Stahl

Лишний код - лишние баги. При наличии 100% работающих лейаутов этот лишний код - эталонный велосипед, достойные палаты мер и весов.

trex6 ★★★★★
()
Ответ на: комментарий от trex6

?!!
Наоборот же меньше кода! Наследоваться от виджета всё равно нужно — стандартный виджет в качестве единственного полностью бесполезен, а QMainWindow и вся невменяемая хрень, формируемая на базе *.ui идут в топку.
Кода получается меньше и он получается «прозрачней» — вот он, написан, а не что там препроцессор нахимичит.

Stahl ★★☆
() автор топика
Ответ на: комментарий от Stahl

this->findChild

И вот это вот не костыли? Не смешите меня.

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

Хотя, конечно, сможете, но на это уйдет куча драгоценного времени. А время - деньги. Поэтому исопльзовать костыли - дорого, а пользоваться готовыми и проверенными решениям - выгодно.

trex6 ★★★★★
()
Ответ на: комментарий от trex6

А-а-а... Я тебя не понял. Ты про тот кусок кода... Да, там лишнее. Это можно было и не трогать.
Тю, я просто про тему треда, а вы там уже перешли в срач о частностях:)

Stahl ★★☆
() автор топика
Ответ на: комментарий от Stahl

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

Хотя, конечно, сможете, но на это уйдет куча драгоценного времени. А время - деньги. Поэтому исопльзовать костыли - дорого, а пользоваться готовыми и проверенными решениям - выгодно.

В твоем коде будет куча подобных косяков. Вопрос не про конкретный кусок кода, а про подход к разработке ПО.

trex6 ★★★★★
()
Ответ на: комментарий от Stahl

а QMainWindow и вся невменяемая хрень, формируемая на базе *.ui идут в топку.

Ты что-то делаешь не так. Тебе нужно прочитать официальную книженцию по Qt. Там расписано как работать с Qt Designer и ui-файлами. Ты без нужного уровня знаний полез сразу в пекло.

Никто в больших Qt-проектах не пишет сейчас виджеты и лайауты вручную, все юзают дизайнер для этого дела. Так как тупо проще потом это всё поддерживать, чем твои наколенные:

QWidget* w = new QWidget();
QHBoxLayout* mainLayout = new QHBoxLayout();
w->setLayout(mainLayout);

QMainWindow — это форма для тяжёлых приложений, с различными статус-строками, менюбаром, и тулбарами. Тебе нужно было просто выбрать в дизайнере нужный виджет за основу, например QDialog или QWidget, накидать на него нужное и собственно, кодить логику.

Читай: Бланшет,Саммерфилд - QT4 Программирование GUI на С++.2ed.2008 вторую и первую главу.

EXL ★★★★★
()
Последнее исправление: EXL (всего исправлений: 1)
Ответ на: комментарий от trex6

Если вы все еще считаете, что «лейауты созданы для чего-то другого», то мне жаль вас и ваших пользователей.

Перед тем как писать такую пафосную чушь, хотя бы почитал тот пост, на который ополчился. Ломишься в открытую дверь, между прочим.

nezamudich ★★
()
Ответ на: комментарий от trex6

В твоем коде будет куча подобных косяков. Вопрос не про конкретный кусок кода, а про подход к разработке ПО.

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

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.