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

Войти
 
  Начало Форум WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  
  Просмотр сообщений
Страниц: [1] 2 3 ... 50
1  Qt / Пользовательский интерфейс (GUI) / Qt. Как проще сделать виджет, сильно похожий на заданный? : Июль 21, 2021, 11:17
Имеется следующий виджет-меню:

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Точно, так и есть.
6  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
7  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), прошу скомпилить проект и сказать, работает ли выбор шрифта, применяется ли выбранный шрифт.
8  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
9  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() для действия выбора шрифта.

И я никак не могу придумать, как наиболее правильно и просто вставить это дейтствие как невидимое действие на тулбар.
10  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

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

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

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

То есть, можно обойтись и первым конструктором.
13  Qt / Model-View (MV) / Re: Возможно ли добавление строк в корень QStandardItemModel с помощью insertRows()? : Декабрь 06, 2018, 14:12
Нет, потому что у него "Note: Calling index() on the QStandardItem object retrieved from this function is not valid". То есть index() у этого элемента невалидный, и по сути, то же самое что вызов QModelIndex() (который дает невалидный индекс). То есть получить index, который бы указывал на корень дерева, через элемент invisibleRootItem() невозможно.

Ещё там в справке есть "An example usage of QStandardItemModel to create a tree".
В это примере как раз подход, который используется в первом конструкторе. И ни слова не говорится, надо ли уничтожать в деструкторе понаделанные через new элементы.
14  Qt / Model-View (MV) / Возможно ли добавление строк в корень QStandardItemModel с помощью insertRows()? : Декабрь 06, 2018, 13:44
Написал я конструктор модели, унаследованный от QStandardItemModel. Модель подразумевается древовидная. В нем shortcutManager.availableSection - просто QStringList с названиями разделов «верхнего» уровня:

Код:
ShortcutSettingsModel::ShortcutSettingsModel(QObject *parent) : QStandardItemModel(parent)
{
    // Создание разделов
    foreach(QString sectionName, shortcutManager.availableSection) {
        QStandardItem *sectionItem=new QStandardItem(sectionName);
        this->appendRow(sectionItem);
    }
}

Конструктор работает, строки в виде появляются.

А потом думаю: нет, эдак у меня память потечет, потому что если сделать clean() в деструкторе, то очистится модель, а удалятся ли из кучи вставленные в нее QStandardItem - неизвестно. Придется городить рекурсивную очистку элементов, ну его нафиг.

Поэтому переписал конструктор вот так:

Код:
ShortcutSettingsModel::ShortcutSettingsModel(QObject *parent) : QStandardItemModel(parent)
{
    // Создание разделов
    int nSection=shortcutManager.availableSection.size(); // Количество разделов

    this->insertRows(0, nSection, QModelIndex()); // Вставка строк для разделов

    for(int i=0; i<nSection; ++i) {
        QModelIndex index=this->index(i, 0);

        QString sectionName=shortcutManager.availableSection.at(i);
        this->setData(index, sectionName); // Установка значения строки
    }
}

Но с таким кодом строк дерева в виде не видно.

Я подозреваю, что проблема в методе insertRows(). Третьим параметром он принимает индекс элемента, для которого создаются «подчиненные» элементы. Проблема в том, в концепции QStandardItemModel нет специального индекса для корня дерева. Есть только невалидный индекс, и предполагается, что ячейки первого уровня просто имеют невалидный индекс родителя.

Тогда возникает вопрос: а как блин создать ячейки первого уровня, если insertRows() требует индекс корневого элемента, но у нас его нет? Я пробую указать невалидный индекс как QModelIndex(), это прокатывает при компиляции, но во время работы толку от этого индекса нет.

Еще заметил, что когда крутится цикл, конструкция

Код:
this->index(i, 0)

все время возвращает одно и тоже значение, несмотря на то, что i меняется.

Получается, что метод insertRows() невозможно применить для корня дерева, а можно применять только для элементов, которые уже есть в дереве. А как добавлять эти самые первичные элементы?
15  Qt / Qt Quick / Re: Тупит QML на примитивном коде - что ему еще надо? (С видео) : Декабрь 05, 2018, 13:18
xintrea
Вохможно, дрова на видюху надо обновить.
А что вкладка "Начало" в Среаторе, подвержена проблеме? Она вроде тоже на qml вся
Debian Stable 9 и Intel i915, какие там дрова на видюху.

Это проблема DE, при сворачивании до обычного размера, DE видимо не посылает какой-то сигнал, и окно типа QML Window не знает что надо перерисовываться.

"Начало" в креаторе может быть и на QML, но окно QML Window, если оно и есть, сделано "внутри" стандартного Qt-окна. А у стандартных Qt-окон в Linux уже давно все баги поотлавливали.
Страниц: [1] 2 3 ... 50

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