
![]() |
Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
|
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[18.97.14.90] |
![]() |
|
Страницы: (3) 1 [2] 3 все ( Перейти к последнему сообщению ) |
Сообщ.
#16
,
|
|
|
Ну тут не посмотрел - немного напряг со временем. Чуть позже, если разгребусь. Но сразу советы-аксиомы:
1) Любой вид контрола/виджета - мы всегда добавляем в лайаут родителя 2) В лайаут родителя мы можем добавлять не только контролы, но и дочерние лайауты (это если необходимо создать сложную структуру размещений) 3) Если мы хотим контрол сделать чьи-то родителем, мы должны создать новый лаяут, и установить его в этот контрол. Тогда, добавляя прочие контролы в созданный лайаут, мы фактически добавляем их "в контрол". Это обычно бывает с группирующими контролами. CSV - очень древнее, и сейчас не самое хорошее решение. Мои варианты следующие: Оба вышеуказанных формата, и JSON, и SQLite3 - хорошо поддерживаются Qt. |
Сообщ.
#17
,
|
|
|
Цитата Majestio @ Да мне не к спеху, еще много чего нужно освоить. Спасибо за ответ. По-моему мнению, у меня конфигурация очень простая и не объемная. Наверное, пока сгодится QSettings. А дальше будет видно. Ну тут не посмотрел |
Сообщ.
#18
,
|
|
|
Здравствуйте!
Немного изменил проект Dialog Majestio - сделал несколько файлов (архив qtTestLayout.zip). Все нормально работает, элементы управления на форме появляются. Поскольку в программе на C# форма имеет кнопки изменения размеров окна, решил заменить Dialog на MainWindow. Программа компилируется, но элементы управления не создаются, появляется просто пустая форма с заголовком. Отладчик показывает, что при выполнении программы метод SetupWidgets вызывается и операторы в нем выполняются. Помогите, пожалуйста, разобраться, почему так происходит. Проект прикрепил. Прикреплённый файл ![]() Прикреплённый файл ![]() |
Сообщ.
#19
,
|
|
|
tumanovalex, есть два варианта:
1) Ты возвращаешь тип формы как QDialog, и добавляешь необходимые системные иконки путём вызова в конструкторе: ![]() ![]() setWindowFlags(windowFlags() | Qt::WindowMinMaxButtonsHint); Не тестировал, написал навскидку. Лучше все же ознакомится с темой Window Flags 2) Твой вариант с QMainWindow. Тут немного по-другому. Сперва создаётся QWidget самого верхнего уровня. В него собирается всё содержимое окна. Потом этот виджет устанавливается в качестве центрального с помощью setCentralWidget(QWidget *widget) (ссылка). Добавлено Да, еще ... есть разница в показе формы как диалога из main.cpp: ![]() ![]() dialog.exec(); // Модальный режим //или dialog.show(); // Немодальный режим |
Сообщ.
#20
,
|
|
|
А вообще в QtCreator сейчас дизайнером пользоваться можно? Как оно?
ЗЫ Переделывал в 2008г. программы на Дельфи в QTcreator на С++ (перешел на линукс). С дизайнером не получилось справиться. Рисовал окна и контролы, вроде нормально было, а когда что-то изменить надо было, получалось криво. Плюнул и сделал все в рантайме - все стало хорошо. Кстати, часть программ скомпилил в Lazarus - без проблем. |
Сообщ.
#21
,
|
|
|
SergeyIT, в принципе примитивные статические формы в QtCreator'е делать можно. Как говорят на "вкус и цвет" ... Но я по опыту просто не советую. Со временем и простые формы кодировать получается не сильно медленнее, чем "рисовать" в дизайнере. Повторяться не буду, тут уже было обширное обсуждение.
|
Сообщ.
#22
,
|
|
|
Majestio, спасибо, не видел этого обсуждения.
|
![]() |
|
|
Решил использовать для первой вкладки QGridLayout:
![]() ![]() void MainWindow::SetupWidgets() { setWindowTitle("Такая программка"); setMinimumSize(640,480); // Инициализирование табов и помещение в макет TabWidget = new QTabWidget; for (auto i=0; i<3; i++) Tabs.push_back(new QWidget); TabWidget->addTab(Tabs[0],"Настройка программы"); TabWidget->addTab(Tabs[1],"Графики"); TabWidget->addTab(Tabs[2],"Вывод результатов"); setCentralWidget(TabWidget); // Создание лайаута для таба 0 QGridLayout *layTab0 = new QGridLayout; Tabs[0]->setLayout(layTab0); // Создание групбокса "Каналы" QGroupBox *grbChannels = new QGroupBox("Каналы"); for (auto i = 0; i < 16; i++) Checks.push_back(new QCheckBox(QString::number(i+1))); QGridLayout *layCheck = new QGridLayout; grbChannels->setLayout(layCheck); for (int i = 0; i < 16; ++i) layCheck->addWidget (Checks[i], i % 8, i / 8); grbChannels->setSizePolicy(QSizePolicy::MinimumExpanding, QSizePolicy::MinimumExpanding); layTab0->addWidget(grbChannels, 0, 0, Qt::AlignLeft); } Прикреплённая картинка
Прикреплённый файл ![]() |
Сообщ.
#24
,
|
|
|
tumanovalex, как мы договаривались ранее - я тебе код не пишу. Но даю наводку ...
Если хочешь элементы управления в твоём гриде "отталкивать" в какую либо сторону (или стороны) - используй addStretch. Читай доки, ищи примеры. |
Сообщ.
#25
,
|
|
|
Получилось с помощью addStretch и setFixedSize:
![]() ![]() grbChannels->setFixedSize(350, 60); ........ grbParamsData->setFixedSize(600, 300); ........ QVBoxLayout *layLower = new QVBoxLayout(); QHBoxLayout *layButtons = new QHBoxLayout(); layButtons->addWidget(grbSettings); layButtons->addWidget(grbAdc); layLower->addLayout(layButtons); layLower->addStretch(0); layTab0->addLayout(layLower, 1, 0, Qt::AlignLeft); Прикреплённый файл ![]() |
Сообщ.
#26
,
|
|
|
tumanovalex, лучше покажи скрин, и на нем стрелками укажи что не нравится, и что куда нужно передвинуть.
|
Сообщ.
#27
,
|
|
|
Цитата tumanovalex @ Не очень понял, почему изменение значений в addStretch не изменяет расположения layLower по отношению к grbParamsData. Дам наводку. Хотя тебе бы было более полезно самому RTFM. Как работает addStretch? Это, считай, "псевдо-виджет", который просто вставляет пустое пространство, которое может раздвигать соседние элементы в лайауте. Простой вариант: есть несколько виджетов, вставленных в лауаут, и один addStretch(1) - он эти элементы раздвинет влево-вправо, или вверх-вниз, в зависимости от типа лайаута Более сложный вариант: есть несколько виджетов, вставленных в лауаут, и есть несколько addStretch, пусть один будет с аргументом 1, а второй 3. Они также будут раздвигать соседние виджеты. Но тут разница в том, что первый addStretch постарается раздвинуть соседние элементы так, чтобы раздвигаемое пространство было примерно равно 1/3 раздвигаемому пространству второго addStretch. Лайфхак! ![]() Для теста таких "вещей" заведи подкаталог с проектами-тестами. Почитал доку, осознал, протестируй в очередном тестовом проекте. Убедись. ...Ну и чтобы закрепить это "действо" - этот каталог назови не Tests, а Testo. В честь моих когда-то таких же "стартов", когда тесты нужно было месить как тесто ![]() |
Сообщ.
#28
,
|
|
|
При запуске программы расстояние между меткой с надписью "Выбран файл для записи результатов" и групбоксами ниже небольшое. При максимизации экрана это расстояние становится большим. Скриншоты и проект без setFixedSize прикрепил. Подскажите, пожалуйста, каким графическим редактором лучше пользоваться для нанесения разноцветных стрелок, овалов и надписей на рисунках. Я пользуюсь XnView, в этой программе мне не удалось сделать стрелки и овалы.
Прикреплённая картинка
Прикреплённая картинка
Прикреплённый файл ![]() Добавлено Хотелось бы также научиться задавать расстояние между групбоксами, например групбоксом "Параметры настройки..." и групбоксами "Сохранение настроек" и "Работа с АЦП". Сейчас они придвинулись вплотную, а хотелось бы установить заданное расстояние. |
Сообщ.
#29
,
|
|
|
Цитата tumanovalex @ Подскажите, пожалуйста, каким графическим редактором лучше пользоваться для нанесения разноцветных стрелок, овалов и надписей на рисунках. Я пользуюсь XnView, в этой программе мне не удалось сделать стрелки и овалы. Для получения скриншотов и быстрого нанесения там же линий, стрелок и прямоугольников лучше всего использовать Lightshot. |
Сообщ.
#30
,
|
|
|
Цитата tumanovalex @ При максимизации экрана это расстояние становится большим. Ну я твой код не буду переписывать. Просто посмотри как работает "расширитель", сделай тестовый пример: ![]() ![]() Dialog::Dialog(QWidget *parent) : QDialog(parent) { QVBoxLayout *L = new QVBoxLayout(); QPushButton *B1 = new QPushButton("111"); QPushButton *B2 = new QPushButton("222"); QPushButton *B3 = new QPushButton("333"); L->addWidget(B1); L->addWidget(B2); L->addWidget(B3); L->addStretch(1); // посмотри как эта строчка влияет - пробуй ее закомментировать и пересобрать, потом сними комменты и опять пересобери setLayout(L); setMinimumSize(640,480); } |