Russian Qt Forum
Май 10, 2024, 03:55 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало Форум WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  
  Просмотр сообщений
Страниц: [1]
1  Qt / Вопросы новичков / Re: Исчезающие виджеты или группы виджетов. : Октябрь 18, 2021, 19:53
Благодарю. Основная часть задачи у меня вполне решилась, но остались шероховатости, мелкие, однако неприятные.

Все виджеты, которым я в теле конструктора класса MainWindow сказал hide() - исправно дематериализовались, а после того, как используя одну еще не задействованную кнопку сказал им же setVisible(true) - так же дисциплинированно материализовались обратно.

Но, при этом, выявилась неприятная проблема с подгонкой размеров окна. После дематериализации виджетов, окно MainWindow имеет те же размеры, что и с видимыми виджетами, но образовавшееся пустое место более-менее справедливо распределено между вертикальными пружинками в компоновке окна. Если окно вручную, захватив нижнюю грань мышкой, уменьшить по вертикали, то оно принимает правильные размеры, однако автоматически этого делать не хочет.
Сжатое таким манером окно, после setVisible(true), прекрасно ремасштабируется до нужной компоновки, с учетом "проявившихся" виджетов.

Я честно пытался уговорить окно ужаться по вертикали. После hide() я говорил ему
Код:
this->resize(minimumSize());
еще
Код:
this->resize(minimumSizeHint());
после них (и без них)
Код:
this->adjustSize();
Даже получил высоту общего контейнера с "исчезнувшими" виджетами и вычел ее из общей высоты окна.
Код:
this->resize(this->size().width(), this->size().height() - ui->verticalLayoutInvisible->geometry().size().height());
Ни в какую!

Как мне уговорить окно MainWindow самостоятельно сделать то, что я делаю мышкой - уменьшить высоту до минимально возможной, с учетом видимых элементов?
 
Ogogon.
2  Qt / Вопросы новичков / Исчезающие виджеты или группы виджетов. : Октябрь 17, 2021, 17:51
Коллеги, подскажите, пожалуйста, как сделать, чтобы виджет, или группа виджетов, могли появляться или исчезать в окне?

Предположим, что у меня есть некое окно. Я схимичил его с любезной помощью Qt Designer'а. Оно более-менее корректно сверстано, расперто пружинками, при изменении размеров ведет себя вполне прилично.

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

Сейчас у меня эти элементы все равно есть, но я с помощью метода setEnabled() или оживляю их или делаю серыми и потухшими.

А можно ли устроить так, чтобы они вообще полностью исчезали, или наоборот - волшебно появлялись. (Ну, а за счет компоновщика, окно подправляло свой вид.)

Признателен за совет,
Ogogon.
3  Qt / Вопросы новичков / Re: Как правильно добавить параметр классу окна? : Октябрь 17, 2021, 17:29
Благодарю! Правда, пришлось добавить еще в одном месте.
dialogMyForm.cpp:
Код:
DialogMyForm::DialogMyForm(const QString &recordName, QWidget *parent) :
    QDialog(parent),
    ui(new Ui::DialogMyForm)
{
...

Ogogon.
4  Qt / Вопросы новичков / Как правильно добавить параметр классу окна? : Октябрь 13, 2021, 14:43
Коллеги, пожалуйста подскажите, как мне правильно сделать то, что я хочу. Я только разбираюсь с C++ и не до конца владею всеми деталями, всю жизнь писал на кернигановском C.

У меня есть класс, реализующий окно, которое служит формой для ввода информации. Затем эта информация вносится в базу данных. Код класса создан автоматически, программой Qt Creator.
Мне нужно, чтобы форма работала в двух режимах - первичного ввода новой записи и редактирования уже имеющейся.

Вот код класса.
dialogMyForm.cpp:
Код:
DialogMyForm::DialogMyForm(QWidget *parent) :
    QDialog(parent),
    ui(new Ui::DialogMyForm)
{
...

dialogMyForm.h:
Код:
class DialogMyForm : public QDialog
{
    Q_OBJECT

public:
    explicit DialogMyForm(QWidget *parent = nullptr);
    ~DialogMyForm();
...

Вызывается этот класс из класса MainWindow, вот таким манером (MainWindow.cpp):
Код:
DialogMyFunc dialogMyFunc;
dialogMyFunc.setModal(true);
dialogMyFunc.exec();

Мне нужно, при вызове класса dialogMyFunc, передавать еще один параметр, например
Код:
QString recordName
Если переменная пуста, или равна NULL, то надо выводить "чистую" форму, а если содержит значение - выловить в базе соответствующую запись и вписать ее в поля формы.

Теперь вопрос - как мне правильно изменить код класса, чтобы появился еще один параметр и как для его передачи поменять код вызова.

Заранее признателен,
Ogogon.
5  Qt / Вопросы новичков / Re: Проблема с функцией класса MainWindow, вызванной из другого : Октябрь 10, 2021, 07:59
Вам нужно не создать ещё один экземпляр вашего MainWindow, а найти его в приложении. А затем уже вызывать myFunc.
Я сделал следующим образом и у меня заработало.

В файл main.cpp я включил указатель на класс MainWindow:
Код:
Mainwindow *mw;

В файл заголовков main.h добавил информацию о нем:
Код:
extern Mainwindow *mw;

В конструкторе класса MainWindow в файле mainmindow,cpp начал заносить туда указатель:
Код:
mw = this;

Далее, вызвал из другого класса:
Код:
mw->myFunc();

Подскажите, пожалуйста, корректно ли такое решение?

Ogogon,
6  Qt / Вопросы новичков / Re: Проблема с функцией класса MainWindow, вызванной из другого : Октябрь 10, 2021, 00:05
Вам нужно не создать ещё один экземпляр вашего MainWindow, а найти его в приложении. А затем уже вызывать myFunc.
Или передать в те классы, которые эту функцию будут использовать, указатель на MainWindow.
Благодарю. К сожалению, я не совсем понял, как это нужно делать практически. Мой опыт борьбы с C++ пока не велик.
Как мне "найти MainWindow" из другого класса? Как в класс, который реализует окно, запускаемое по сигналу интерфейса через приватный слот, передать указатель на MainWindow?

Полагаю, что вызов публичной функции из другого класса - достаточно типовая необходимость. Наверное, для этого в C++ есть какие-то корректные механизмы?

Ogogon.
7  Qt / Вопросы новичков / Проблема с функцией класса MainWindow, вызванной из другого : Октябрь 09, 2021, 15:39
Коллеги, подскажите, пожалуйста, в чем моя проблема. Полагаю, что она элементарна, но я всю жизнь писал на кернигановском C и в C++ пока еще не чувствую себя уверенно.

Ситуация такая - у меня есть публичная функция в классе MainWindow, она читает из SQLite записи, и одно их поле докидывает в расположенный в главном окне combobox, как айтемы. Перед этим очищает его от старых.
Комбобокс адресуется как
Код:
ui->comboBoxMy
. В нем задействованы методы count(), removeItem(), addItem(). (Очистка поштучно делается, чтобы сохранить самый первый, по номеру нулевой, айтем - он там постоянный житель и должен быть всегда.)

Теперь проблема - когда я вызываю функцию из ее же класса MainWindow, все работает просто расчудесно, все что надо убирается, все что надо - добавляется. Комбобокс показывает текущее состояние таблицы в SQlite. Но если я вызываю функцию из других классов, то работа с СУБД идет нормально, (считанное дублируется в qDebug), а вот содержимое комбобокса не изменяется.
Функцию я вызываю так:
Код:
MainWindow mw;
mw.myFunc();

Подскажите, пожалуйста, что я делаю не так?

Ogogon.
8  Qt / Вопросы новичков / Автоматическая сборка для десктопа/планшета/телефона : Сентябрь 23, 2021, 02:14
Коллеги, подскажите пожалуйста, можно ли штатными средствами устроить так, чтобы проект собирался под нужный тип платформы, а именно десктоп, таблет или телефон без переделок?

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

Ogogon.
Страниц: [1]

Страница сгенерирована за 0.054 секунд. Запросов: 24.