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

Войти
 
  Начало Форум WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  
  Просмотр сообщений
Страниц: [1] 2 3 ... 50
1  Qt / Qt Quick / QML - последовательность вызовов onAccepted(), onRejected(), onClose(). : Сентябрь 30, 2022, 15:58
Сделал окошечко на базе Dialog, сделал две кнопки [OK] и [Cancel] плюс  в уголку кнопка закрытия [X].

[OK] - вызывает accept()
[Cancel] - вызывает reject()
[X] - вызывает close()

И, естественно, прописал диалогу обработчики:
Код:
onAccepted() { ... Действие 1 ... }
onRejected() { ... Действие 2 ... }
onClose() { ... Действие 3 ... }

Проблема в том, что если нажать OK или Cancel, то вначале QML сгенерирует вызов onClose(), и только потом onAccepted() или onRejected().

Получается, что хочу я того или не хочу, при нажатии OK будет выполнено:

Действие 3
Действие 1

А при нажатии Cancel будет выполнено:

Действие 3
Действие 2

Но в моей программе важна последовательность действий. И мне нужно, в идеале, как-то сделать, чтобы при нажатии OK или Cancel срабатывал только тот код, который написан в их обработчике.

Если это невозможно, то хотя бы сделать так, чтобы для ОК выполнялось:

Действие 1
Действие 3

А для Cancel выполнялось:

Действие 1
Действие 2

Как этого добиться?

Другими словами: в onClose() надо каким-то образом узнать, это «чистое» закрытие окна, или закрытие через кнопку OK/Close. И дело усложняется тем, что onClose() вызывается ПЕРЕД onAccepted()/onRejected(), то есть невозможно выставить, например, переменную-флаг, на которую можно было бы ориентироваться.
2  Qt / Общие вопросы / Re: Передача ассоциативного массива из QML в C++. Преобразование QJSValue в QVariant : Сентябрь 29, 2022, 17:37
QJSValueIterator
QJSValue QJSValue::property(const QString &name) const

Решение тут: https://www.linux.org.ru/forum/development/16985890
3  Qt / Общие вопросы / Передача ассоциативного массива из QML в C++. Преобразование QJSValue в QVariant : Сентябрь 29, 2022, 10:12
Имеется Qt 5.11.

Вызываю функцию из QML через JavaScript. В качестве параметра передается ассоциативный массив (индексы - строки и значения - строки).

Код:
var a;
a["one"]=odin;
a["two']=dva;

ourExemplar.ourMethod(a);

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

https://doc.qt.io/qt-5/qtqml-cppintegration-data.html

Однако все, что я могу вытащить из QJSValue - это QVariantList (это алиас QList<QVariant>). Да и то этот список будет нуливого размера.

Вот код:

Код:
void OurClass::ourMethod(QJSValue jsVal)
{
    qDebug() << Q_FUNC_INFO << "Слот ourMethod()";

    qDebug() << "Результат isObject(): "  << jsVal.isObject();
    qDebug() << "Результат isQObject(): " << jsVal.isQObject();
    qDebug() << "Результат isArray(): "   << jsVal.isArray();
    qDebug() << "Результат isVariant(): " << jsVal.isVariant();

    qDebug() << "QJSValue содержит тип " << jsVal.toVariant().userType();
    qDebug() << "Тип QVariant "     << qMetaTypeId<QVariant>();
    qDebug() << "Тип QVariantList " << qMetaTypeId<QVariantList>();
    qDebug() << "Тип QVariantMap "  << qMetaTypeId<QVariantMap>();
    qDebug() << "Тип QJSValue: "    << qMetaTypeId<QJSValue>();

    QVariantList list=jsVal.toVariant().toList();
    qDebug() << "Длинна list: " << list.size();

Вот результат:

Код:
void OurClass::ourMethod(QJSValue) Слот ourMethod()
Результат isObject():  true
Результат isQObject():  false
Результат isArray():  true
Результат isVariant():  false
QJSValue содержит тип  9
Тип QVariant  41
Тип QVariantList  9
Тип QVariantMap  8
Тип QJSValue:  1056
Длинна list:  0

Здесь видно, что isObject() и isArray() одновременно выдают true. Не знаю, должно ли так быть.

Узнать какой тип содержится в QVariant элемента списка я не могу придумать как, так как нет даже первого элемента, ведь список пустой.

В общем, задача - передать ассоциативный массив из QML в C++, но я не могу разобраться как это сделать. Везде пишется как конвертить из C++ в QML, а мне надо наоборот. У буржуев нашел вот такое:

https://lists.qt-project.org/pipermail/development/2014-September/018513.html

Но тут тоже направление из C++ в QML. Как будто из QML в C++ никто ничего структурированного не передает.
4  Qt / Пользовательский интерфейс (GUI) / Qt. Как проще сделать виджет, сильно похожий на заданный? : Июль 21, 2021, 11:17
Имеется следующий виджет-меню:

http://i.piccy.info/i9/c7c16510d27ba4873ffec2e649009df0/1626854321/67618/1436382/udoLaso01.png

Нужно сделать такой же на Qt5 (обычные виджеты, не QML), всеми пикселями похожий на заданный.

Стиль Windows для QToolButton или для QFrame, в принципе, подходит. Я бы мог понапихать слева-направо или кнопки или фреймы, чтобы составить такое меню. Но если присмотреться, то между секциями вертикальные разделители не "на полную глубину" а как бы "в половину глубины".

Вот я и думаю, каким макаром проще всего сделать меню с такими разделителями секций?
5  Qt / Вопросы новичков / Нужно ли пробрасывать mouseMoveEvent в QTableView? : Декабрь 29, 2020, 16:29
Возник такой теоретический вопрос: если в классе, унаследованном от QTableView, имеется своя реализация mouseMoveEvent, то нужно ли в моменты, когда собственной обработки внутри переопределенного mouseMoveEvent не предусмотрено, вызывать родительский mouseMoveEvent?

Код:
void MyView::mouseMoveEvent(QMouseEvent *event)
{
  ...
  QTableView::mouseMoveEvent(event);
}

Можно ли вообще не делать вызова родительского mouseMoveEvent? На что отсутствие вызова родительского mouseMoveEvent может повлиять?

На первый взгляд действительно, родительский обработчик mouseMoveEvent можно вообще не вызывать. Но может быть, есть какие-то неочевидные ситуации? Например, если не вызывать, то перестанет правильно работать драг-анд-дроп в режиме мультивыбора, или там перестанет выделяться строка при настройке QAbstractItemView::SelectRows после клика мышки на незаполненной строками области таблицы, или еще какая-нибудь замудренная хрэнь?
6  Qt / Общие вопросы / Не могу добавить шаг компиляции - ошибка «Невозможно запустить процесс ...» : Сентябрь 23, 2020, 10:05
Имею QtCreator 4.10.2

Пытаюсь в настройках сборки сделать дополнительный шаг. Нажимаю:
Код:
Сборка, добавить этап -> Особый
В поле "Команда" пишу:
Код:
echo hello
В результате, при сборке появляется ошибка:
Код:
Невозможно запустить процесс «echo hello»
Думал, может там среда выполнения не настроена, попробовал так:
Код:
/bin/echo hello
Такая же ошибка. Попробовал даже так:
Код:
/bin/bash -c "echo hello"
То же самое, невозможно запустить процесс.

Вопрос: как блин в QtCreator настраивать особый шаг обработки?

7  Qt / Пользовательский интерфейс (GUI) / Как узнать padding для элемента таблицы QTableView? : Февраль 03, 2020, 14:57
Для столбца с иконкой и текстом (самый левый столбец) мне надо высчитать фиксированную ширину столбца, и задать ее в пикселях (так хочет архитектор).

Размер иконки известен, размер самой длинной строки текста в столбце тоже известен и вычисляется через fontMetrics(). Неизвестен только дефолтный padding, применяемый в ячейке, а он нужен для расчетов.

Я читаю доку, шерстю интернет, но нахожу только решения "как установить padding":

Код:
ui->fingerTableView->setStyleSheet("QTableView::item {padding: 25px }");

Мне же нужно сделать обратную вещь: узнать дефолтный padding у элемента таблицы.

Есть метод styleSheet(), который возвращает стиль, и я бы мог его пропарсить. Но проблема в том, что этот метод на самом деле возвращает просто стиль, заданный через setStyleSheet(), а не дефолный стиль.

Откуда еще можно вытянуть дефолный padding для элемента таблицы, я разобраться не могу. Поможите.
8  Qt / Интернационализация, локализация / Re: Не работает перевод интерфейса до старта QApplication. Можно это как-то обойти? : Январь 20, 2020, 11:26
все просто: объект langTranslator находится на стеке и умирает после выхода из InstallDialog::setupAutoLangTranslation(), поэтому перевод не подгружается

Точно, так и есть.
9  Qt / Интернационализация, локализация / [Решено] Не работает перевод до старта QApplication. Можно это как-то обойти? : Январь 20, 2020, 09:49
Перед тем, как будет стартовать объект QApplication (метод exec()), мне нужно подготовить определенные файлы, которые нужны для корректного старта, чтобы приложение могло их найти.

Подготовка файлов требует пользовательского выбора с вопросом "где разместить нужные файлы?". Соответственно нужно открыть окно, в котором будет интерфейс выбора. Окно такое есть, оно унаследовано от QDialog, оно работает даже до запуска основного приложения.

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

Код:
// Автоматическое определение языка системы
void InstallDialog::setupAutoLangTranslation()
{
    QString lang=QLocale().system().name().split('_').first().toLower();
    QStringList availableLang={"en", "ru"};

    if( !availableLang.contains(lang) )
    {
        lang="en";
    }

    qDebug() << "Auto detect lang in installator: " << lang;

    // Подключение перевода интерфейса
    QString langFileName=":/resource/translations/mytetra_"+lang+".qm";
    qDebug() << "Lang file: " << langFileName;

    QTranslator langTranslator;
    bool loadResult=langTranslator.load(langFileName);

    if(loadResult)
    {
        qDebug() << "Success load translation file";
        qApp->installTranslator(&langTranslator); // Транслятор устанавливается в объекте приложения
    }
    else
    {
        qDebug() << "Can't load translation file";
    }
}

Все установки строк в классе этого окна происходят _после_ данного кода. Естественно, все строки обернуты в tr(), сделаны lupdate, linguist, lrelease.

Однако перевода интерфейса не происходит.

Я думал, что перевод не работает из-за того, что настройка языка делается в конструкторе окна. Однако, внутри класса окна есть вызов еще одного диалогового окна QMessageBox, создаваемом на месте вызова на стеке:

Код:
void InstallDialog::onAccepted()
{
    if( !ui->m_radioButtonStandart->isChecked() and
        !ui->m_radioButtonPortable->isChecked() )
    {
        QMessageBox msgBox;
        msgBox.setText(tr("Please select one of install mode."));
        msgBox.exec();
    }
    else
    {
        this->accept();
    }
}

И в этом окне тоже перевод не работает.

Я сейчас грешу только на то, что перевод не работает из-за того, что объект приложения создан, но его основной цикл не запущен. А применение перевода сделано где-то в глубинах запуска основного цикла.

Вопрос в том, можно ли как-то выйти из этой проблемы, и заставить работать систему локализации Qt? Может быть, есть какой-то вызов, который обновит систему локализации без запуска основного цикла приложения? Или, может быть, есть какой-то другой метод?

Очень не хотелось бы в корне переделывать все приложение из-за такой вот особенности Qt.

Исходники: https://github.com/xintrea/mytetra_dev

Места в исходниках:

* /app/src/views/installDialog/InstallDialog.h
* /app/src/views/installDialog/InstallDialog.cpp
* /app/src/libraries/GlobalParameters.cpp, метод initWorkDirectory()
* /app/src/main.cpp, функция main(), вызов globalParameters.init();

Примечание: Чтобы появилось проблемное окно, не должно существовать директории ~/.config/mytetra
10  Qt / Пользовательский интерфейс (GUI) / Re: Перестало работать форматирование текста в QTextEdit. Что ему еще надо? : Январь 02, 2020, 11:17
В общем, это похоже на регрессию в Qt.

В Qt 5.9.6 и Qt 5.12.4 установка форматирования текста работает.

А в Qt 5.13.1 - нет.

Если у кого стоит Qt версии 5.12.4 и выше (вплоть до 5.14.x), прошу скомпилить проект и сказать, работает ли выбор шрифта, применяется ли выбранный шрифт.
11  Qt / Пользовательский интерфейс (GUI) / Перестало работать форматирование текста в QTextEdit. Что ему еще надо? : Декабрь 31, 2019, 09:19
У меня есть класс EditorTextArea, унаследованный от QTextEdit

В нем есть метод, который вызывается при смене гарнитуры шрифта в QFontComboBox:

Код:
void EditorTextArea::onChangeFontFamily(QString fontFamily)
{
  qDebug() << "Apply font family " << fontFamily;

  // Ранее для установки шрифта хватало одной команды setFontFamily(fontFamily);
  // Теперь так не работает, весь новый код ниже сделан на основе Qt примера Text Edit
  // Но и новый вариант тоже не работает

  QTextCharFormat format;
  format.setFontFamily(fontFamily);

  // Если нет выделения, дополнительным курсором выделяется слово, на котором стоит курсор
  QTextCursor cursor = this->textCursor();
  if (!cursor.hasSelection())
  {
      cursor.select(QTextCursor::WordUnderCursor);
  }

  cursor.mergeCharFormat(format);
  this->mergeCurrentCharFormat(format);
}

Проблема в том, что при срабатывании этого кода на экране ничего не меняется. Новый шрифт не применяется.

Но если подвигать курсором, и посмотреть на виджет выбора шрифта (который отображает текущий шрифт под курсором), можно заметить, что шрифт для выделенного текста установился. Как минимум, в структуре документа место, где был изменен шрифт, помечено, что оно имеет новый установленный шрифт. И при этом начертание текста не меняется!

Однако, если посмотреть на сгенерированный HTML-код такого документа (в примере есть кнопка с паутинкой), то будет видно, что нового шрифта в нем не будет, везде будет упоминаться сплошной Sans Serif.

Это дело происходит на Qt 5.13.1.

Еще наблюдение: стандартный пример Text Edit работает нормально. Тот же самый код приводит к форматированию, новое начертание сразу становится видно.

В общем, не знаю как заставить работать выбор шрифта.


Проект: https://github.com/xintrea/mytetra_dev
Файл: ./app/src/libraries/wyedit/EditorTextArea.cpp
12  Qt / Пользовательский интерфейс (GUI) / Re: Не могу активировать виджет выбора шрифта через горячие клавиши : Декабрь 30, 2019, 01:04
точно должно быть QAction::changed, а не QAction::triggered? дебаггером проходил этот маршрут?

По документации должно быть changed():

https://doc.qt.io/qt-5/qaction.html#shortcut-prop

Дело тут походу в том, что этот QAction не располагается на тулбаре. Вместо него располагается сам виджет EditorFontFamilyComboBox. То есть, есть addWidget() для виджета выбора шрифта, но нет addAction() для действия выбора шрифта.

И я никак не могу придумать, как наиболее правильно и просто вставить это дейтствие как невидимое действие на тулбар.
13  Qt / Пользовательский интерфейс (GUI) / Не могу активировать виджет выбора шрифта через горячие клавиши : Декабрь 30, 2019, 00:24
У меня есть виджет EditorFontFamilyComboBox, унаследованный от QFontComboBox. Чтобы установить на нем фокус, я добавил этому виджету свойство:

Код:
QAction selectAction; // Действие для активации (выбора) данного виджета

которое можно получить через метод:

Код:
QAction *EditorFontFamilyComboBox::getSelectAction()
{
    return &selectAction;
}

Для этого действия я задал соединение сигнала-слота:

Код:
    // Активация данного виджета по горячей клавише
    connect(&selectAction, &QAction::changed,
            this, &EditorFontFamilyComboBox::onChangeSelectAction);

И слот выглядит так:

Код:
void EditorFontFamilyComboBox::onChangeSelectAction()
{
    qDebug() << "Select EditorFontFamilyComboBox";

    this->setFocus(Qt::ShortcutFocusReason);
}

При ините тулбара, на котором размещается объекта класса EditorFontFamilyComboBox, тулбар получает у этого объекта действие через getSelectAction(), и через метод setShortcut() устанавливает нужную комбинацию клавиш (в моем примере это происходит в файле EditorToolBar.cpp, строка 375, которая выглядит так:

Код:
shortcutManager.initAction("editor-fontSelect", fontSelect->getSelectAction() );

А сам метод initAction() выглядит так:

Код:
void ShortcutManager::initAction(QString actionName, QAction *action)
{
    if(keyTable.contains(actionName)) {
        action->setShortcut(  getKeySequence(actionName) );
        action->setStatusTip( getFullDescription(actionName) );
        action->setToolTip(   getDescriptionWithShortcut(actionName) );
        action->setText(      getDescriptionWithShortcut(actionName) );
    } else {
        criticalError("Not found available action name "+actionName);
        return;
    }
}

То есть, если бы вызов этого метода был бы некорректен, была бы ошибка с текстом "Not found available action name ...", но такой ошибки нет.

В общем, проблема в том, что при нажатии шортката, не вызывается слот EditorFontFamilyComboBox::onChangeSelectAction().

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

Ссылка на код: https://github.com/xintrea/mytetra_dev

14  Qt / Установка, сборка, отладка, тестирование / Как в Debian 9 прописать каталог исходников Qt4 (4.8.7) в QtCreator 4.9 ? : Декабрь 16, 2019, 17:20
Здравствуйте!

Мне нужно собирать и отлаживать старые исходники для Qt4 в Linux Debian 9. В репозитарии есть пакеты:

Код:
qt4-default
qt4-qmake
libqt4-dev
libqt4-dev-bin

... и всякие другие, подтягиваемые по зависимостям.

В системе так же установлен Qt 5.13.1 с QtCreator 4.9, взятые с официального сайта http://qt.io. Я пользуюсь именно креатором QtCreator 4.9. Этот креатор автоматически нашел комплект Qt4, и нормально собирает проекты в комплекте Qt4. Проблема в том, что он видит только заголовочные файлы Qt4 из *.-dev - пакетов.

Чтобы решить эту проблему, я прописал в /etc/apt/sources.list репозитарии сырцов:

Код:
deb-src http://security.debian.org/debian-security stretch/updates main contrib
deb-src http://deb.debian.org/debian stretch main
deb-src http://deb.debian.org/debian stretch-updates main contrib
deb-src http://security.debian.org/ stretch/updates main

Далее создал каталог /opt/qt_4_8_7/src и в нем выполнил команду:

Код:
apt-get source qt4-default

В результате выкачались исходники Qt 4.8.7, именно той версии, которая идет в дистрибутиве в пакетах qt4*. Сами исходники, в итоге, лежат в каталоге:

Код:
/opt/qt_4_8_7/src/qt4-x11-4.8.7+dfsg/src

Этот каталог мне нужно прописать где-то в QtCreator 4.9, чтобы я мог просматривать исходники классов Qt. И я не могу понять где и как это сделать.

Единственное место, которое я нашел - это Инструменты - Параметры - Отладчик - Основное - Сопоставление каталогов исходников. Там есть кнопка "Добавить исходники Qt". В результате добавления каталога исходников, прописывается:

Код:
Путь к исходникам: /home/qt/work/qt
Путь назначения: /opt/qt_4_8_7/src/qt4-x11-4.8.7+dfsg/src

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

В любом случае, после такой настройки и перезапуска QtCreator, навигация по исходникам Qt4 не работает. Можно только смотреть h-файлы, но это куски *-dev-пакетов, а не сами исходники Qt.

Вопрос: как правильно прописать исходники Qt4 в QtCreator, чтобы по ним можно было совершать навигацию?
15  Qt / Model-View (MV) / Re: Возможно ли добавление строк в корень QStandardItemModel с помощью insertRows()? : Декабрь 06, 2018, 15:08
Ага, вот тут есть ответ на то, что происходит с элементами, которые создаются через new и вставляются в модель:

Цитировать
Когда объект QStandardItem передаётся в QStandardItemModel , то права собственности на данные объекты передаются в модель. И при вызове метода clear модель автоматически удаляет эти объекты из памяти.

https://evileg.com/ru/post/221/

То есть, можно обойтись и первым конструктором.
Страниц: [1] 2 3 ... 50

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