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

Войти
 
  Начало Форум WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  
  Просмотр сообщений
Страниц: [1] 2
1  Qt / Вопросы новичков / Компановка элементов : Ноябрь 03, 2020, 12:53
Здравствуйте всем!
Необходимо сделать кнопку extended, скрывающую часть элементов.
Переместил все, что хочу скрыть в widget и по нажатию кнопки скрываю ее.
Но при этом окно остается того же размера.

Код:
ui->extention->setVisible(false);
this->resize(this->minimumWidth(), this->minimumHeight());

если вызвать еще раз, то окно приобретает минимальный размер.
Подскажите, как добиться нужного результата?
2  Qt / Вопросы новичков / Re: Проблема с nativeEvent : Октябрь 14, 2020, 06:33
Для таких же дебилов как и я: надо было подписаться на сообщения

Код:
DEV_BROADCAST_DEVICEINTERFACE notificationFilter;

    memset(&notificationFilter, 0, sizeof(DEV_BROADCAST_DEVICEINTERFACE));
    notificationFilter.dbcc_size = sizeof(DEV_BROADCAST_DEVICEINTERFACE);
    notificationFilter.dbcc_devicetype = DBT_DEVTYP_DEVICEINTERFACE;
    notificationFilter.dbcc_classguid  = GUID_DEVINTERFACE_LIST[0];

    devNotify = RegisterDeviceNotification((HANDLE)this->winId(),
                                           &notificationFilter,
                                           DEVICE_NOTIFY_WINDOW_HANDLE);

Так. Еще не все. Обнаружил, что при каждом новом появлении или исчезновении устройства
сообщения с параметром DBT_DEVICEARRIVAL или DBT_DEVICEREMOVECOMPLETE приходят дважды.
3  Qt / Вопросы новичков / Re: Проблема с nativeEvent : Октябрь 14, 2020, 05:15
QCoreApplication::installNativeEventFilter ?
Не разобрался как его использовать.
Вобщем, такое ощущение что сообщения приходят только первому отрисованному окну..

В обоих случаях отлавливается сообщение WM_DEVICECHANGE
Но в случае, когда есть форма авторизации на главное окно приходят только сообщения с параметром
DBT_DEVNODES_CHANGED
Следующего сообщения с параметром DBT_DEVICEARRIVAL или DBT_DEVICEREMOVECOMPLETE уже не приходит.
4  Qt / Вопросы новичков / Re: индексы в прокси модели : Октябрь 06, 2020, 12:51
Разве прокси модель это не делает сама?
DataChanged будет вызваться при изменении прокси модели. Если меняется source модель, то у прокси не срабатывает DataChanged.
Поэтому подключаю.
5  Qt / Вопросы новичков / индексы в прокси модели : Октябрь 06, 2020, 05:03
Здравствуйте
Использую прокси модель, подключаю сигнал таким образом:

Код:
    connect(sourceModel, SIGNAL(dataChanged(QModelIndex,QModelIndex)),
              this, SIGNAL(dataChanged(QModelIndex,QModelIndex)));

Можно ли указать конкретные индексы для обновления? Чтобы последний столбец в прокси модели не обновлялся?
6  Qt / Вопросы новичков / Обновление модели QAbstractTableModel : Октябрь 05, 2020, 07:22
Здравствуйте!
Столкнулся с такой проблемой:
Если ячейка редактируется в момент обновления модели, то значение сбрасывается.



Как этого можно избежать?
7  Qt / Вопросы новичков / Re: QCustomPlot : Сентябрь 07, 2020, 17:02
Нужно использовать QCPCurve Class
8  Qt / Вопросы новичков / Re: Обновление модели : Сентябрь 04, 2020, 05:30
Кстати, заметил еще одну вещь - если вызвать метод загрузки данных в конструкторе, то все работает. Если позже - нет.

Код:
void MainWindow::updateTable()
{
    QList<QString> Measurment;
    QList<QString> Unit;
    QList<QString> Current;

    Measurment.append("X");
    Unit.append("X");
    Current.append(QString::number(X, 'f', 3));

    Measurment.append("Y");
    Unit.append("Y");
    Current.append(QString::number(Y, 'f', 3));

    Measurment.append("Z");
    Unit.append("Z");
    Current.append(QString::number(Z, 'f', 3));

    paramModel->populateData(Measurment, Unit, Current);
}

Пока так и оставил. НО это кажется не правильным решением. Где-то на форуме писали

Цитировать
А, кажется понял.
Если добавляем ряды после конструктора, надо обрамлять это дело beginInsertRows/endInsertRows. Там отстреляются нужные события.
9  Qt / Вопросы новичков / Re: Обновление модели : Сентябрь 04, 2020, 05:14
Причем метод
Код:
ParametersModel::data
начинает вызываться только после изменения размера формы.
10  Qt / Вопросы новичков / Re: Обновление модели : Сентябрь 04, 2020, 05:00
Покажи больше кода, непонятно что и как ты делаешь. такое ощущение, что ты пытаешься дернуть сигнал модели снаружи, а тебе нужно эмитить сигнал из модели после изменения данных. В общем, давай код модели.

Код:
#ifndef PARAMETERSMODEL_H
#define PARAMETERSMODEL_H

#include <QAbstractTableModel>

class ParametersModel : public QAbstractTableModel
{
    Q_OBJECT

public:

    explicit ParametersModel(QObject *parent = nullptr);

    void populateData(const QList<QString> &Measurment, const QList<QString> &Unit, const QList<QString> &Current);

    int rowCount(const QModelIndex &parent = QModelIndex()) const Q_DECL_OVERRIDE;
    int columnCount(const QModelIndex &parent = QModelIndex()) const Q_DECL_OVERRIDE;

    QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const Q_DECL_OVERRIDE;
    QVariant headerData(int section, Qt::Orientation orientation, int role = Qt::DisplayRole) const Q_DECL_OVERRIDE;

private:
    QList<QString> m_Measurment;
    QList<QString> m_Unit;
    QList<QString> m_Current;
};

#endif // PARAMETERSMODEL_H


Код:
#include "parametersmodel.h"

ParametersModel::ParametersModel(QObject *parent)
    : QAbstractTableModel(parent)

{   
}

void ParametersModel::populateData(const QList<QString> &Measurment, const QList<QString> &Unit, const QList<QString> &Current)
{
    m_Measurment.clear();
    m_Measurment = Measurment;
    m_Unit.clear();
    m_Unit = Unit;
    m_Current.clear();
    m_Current = Current;
    emit dataChanged(index(0, 0), index(rowCount(), columnCount()));
    return;
}

int ParametersModel::rowCount(const QModelIndex &parent) const
{
    Q_UNUSED(parent);
    return m_Measurment.length();
}

int ParametersModel::columnCount(const QModelIndex &parent) const
{
    Q_UNUSED(parent);
    return 3;
}

QVariant ParametersModel::data(const QModelIndex &index, int role) const
{
    if (!index.isValid() || role != Qt::DisplayRole) {
        return QVariant();
    }
    if (index.column() == 0) {
        return m_Measurment[index.row()];
    } else if (index.column() == 1) {
        return m_Unit[index.row()];
    } else if (index.column() == 2) {
        return m_Current[index.row()];
    }
    return QVariant();
}

QVariant ParametersModel::headerData(int section, Qt::Orientation orientation, int role) const
{
    if (role == Qt::DisplayRole && orientation == Qt::Horizontal) {
            if (section == 0) {
                return QString("Измерение");
            } else if (section == 1) {
                return QString("ед. изм.");
            } else if (section == 2) {
                return QString("Текущее значение");
            }
        }
        return QVariant();
}

при изменении данных вызываю
Код:
paramModel->populateData(Measurment, Unit, Current);
11  Qt / Вопросы новичков / Обновление модели : Сентябрь 03, 2020, 14:24
Здравствуйте.
Есть модель QAbstractTableModel
почему-то  не обновляет модель при изменении данных.
Если изменить размер родительского окна, то начинает обновлять
Пробовал
Model->dataChanged(index(0, 0), index(1, 1));
QMainwindow::update()
QMainwindow::repaint()

12  Qt / Вопросы новичков / QSlider : Август 31, 2020, 12:38
Здравствуйте!
Задача:

при перемещении слайдера показывать изменяемое значение.
Запись в файл производить при окончании действия со слайдером (иначе запись в файл будет производиться постоянно при перемещении слайдера).

Обрабатываю два сигнала:
valueChanged для отображения изменяемого значения
и sliderRelised для записи.

Нужно обрабатывать запись при перемещении слайдера тиками (нажатиями мыши)
значение меняется, но когда при этом производить запись?
13  Qt / Вопросы новичков / Проблема с nativeEvent : Август 21, 2020, 12:28
Нашел метод определения VID PID вставляемого устройства.

Код:
bool MainWindow::nativeEvent([[maybe_unused]] const QByteArray& eventType, void *message,
                                                 [[maybe_unused]] long *result) {


    MSG *msg = static_cast< MSG * >(message);
    int msgType = msg->message;
    if (msgType == WM_DEVICECHANGE) {
        if (msg->wParam == DBT_DEVICEARRIVAL || msg->wParam == DBT_DEVICEREMOVECOMPLETE) {
            PDEV_BROADCAST_HDR lpdb = (PDEV_BROADCAST_HDR)msg->lParam;
            PDEV_BROADCAST_DEVICEINTERFACE lpdbv = (PDEV_BROADCAST_DEVICEINTERFACE) lpdb;
            if (lpdb->dbch_devicetype == DBT_DEVTYP_DEVICEINTERFACE) {
                QString path = QString::fromWCharArray(lpdbv->dbcc_name);
                qDebug()<<path;
                m_DevConnect->VID = "";
                m_DevConnect->PID = "";
                m_DevConnect->SN = "";               
                if (!path.isEmpty()) {
                    if (path.contains("VID_", Qt::CaseInsensitive))
                        m_DevConnect->VID = path.mid(path.indexOf("VID_")+4, 4);
                    if (path.contains("PID_", Qt::CaseInsensitive))
                        m_DevConnect->PID = path.mid(path.indexOf("PID_")+4, 4);                   
                    QRegExp rx("#\\w{8}#");
                    if (path.contains(rx))
                        m_DevConnect->SN = path.mid(rx.indexIn(path)+1, 8);
                    m_isBoardConnected = path.contains(VID_CP2112, Qt::CaseInsensitive);
                    m_isOPMConnected = path.contains(VID_OPM, Qt::CaseInsensitive);
                } else return false;

                if (msg->wParam == DBT_DEVICEARRIVAL)
                    emit SigUsbArrived(path);
                else
                    emit SigUsbRemoved(path);
                return true;
            }
        }
    }
    return false;
}

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

Код:
    w.show();
    w.hide();
    w.display();


в
Код:
 w.display();
запускается другая форма.

Как это побороть? может быть есть способ?
14  Qt / Вопросы новичков / Re: Ошибка QSqlError "2026" : Август 21, 2020, 10:30
Разобрался. При дебаге запросы шли по протоколу TLSv1.1, а при релизе TLSv1.3.
Протокол TLSv1.3 пришел на замену TLSv1.1 и вполне возможно не все компиляторы
успели обновиться. Поменял компилятор и все заработало.
15  Qt / Вопросы новичков / Re: Ошибка QSqlError "2026" : Август 21, 2020, 05:04
Вобщем, странная ситуация. На релизе работает без ошибок. В дебаге так и не подключается. Есть мысли?
Страниц: [1] 2

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