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

Войти
 
  Начало Форум WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  
  Просмотр сообщений
Страниц: [1] 2
1  Qt / Пользовательский интерфейс (GUI) / QTableView стиль выделения : Апрель 12, 2023, 12:25
Коллеги, добрый день

Есть табличка с раскрашенными в разные цвета строками (белый и синий).

На текущий момент использую стиль
Код:
 QTableView::item:selected {background: " + QString(COLOR_STANDARD_TABLE_CURSOR) + "; color: " + QString(COLOR_BLACK) + "}


Однако получается так, что при выделении строки, вне зависимости от того какого цвета был бэкграунд строки она подкрашивается в цвет COLOR_STANDARD_TABLE_CURSOR, что собственно не удивительно  Улыбающийся

Использование цвета с прозрачностью не привел к каким либо результатам, прозрачность просто игнорируется и цвет вылеления одинаков на всех строках, вне зависимости от их бэкграунд цвета.
Код:
QTableView {selection-background-color: rgba(255, 0, 0, 50)}

Собственно вопрос: есть ли возможность подсвечивать выделение прозрачным цветом?
Как задать бордер выделения всей строки, а не каждого итема для строки?

Код:
QTableView {selection-background-color: rgba(255, 0, 0, 50);border: 3px solid black}

Заранее спасибо за помощь



2  Qt / Пользовательский интерфейс (GUI) / QGraphicsView, ограничение зуммирования : Август 10, 2022, 14:38
Добрый день, первый раз сталкиваюсь с рисованием в Qt

Подскажите пожалуйста как задать рамки для зума.


Само увеличение и уменьшение реализовано довольно тривиально:

Код:
void GraphicsView::wheelEvent(QWheelEvent *e)
{
    if (e->modifiers() & Qt::ControlModifier) {
        if (e->angleDelta().y() > 0)
            view->zoomIn();
        else
            view->zoomOut();
        e->accept();
    } else {
        QGraphicsView::wheelEvent(e);
    }
}

// -----------------------------------------------------------

class View : public QFrame
{
    Q_OBJECT
public:
    explicit View(const QString &, QWidget *parent = nullptr);

    QGraphicsView *view() const;
....
}

void View::setupMatrix()
{
    qreal scale = qPow(qreal(2), (zoomValue - 250) / qreal(50));
    QTransform matrix;
    matrix.scale(scale, scale);
    matrix.rotate(0);
    graphicsView->setTransform(matrix);
    setResetButtonEnabled();
}

void View::zoomIn()
{
    if (zoomValue + ZOOMDELTAVALUE <= ZOOMMAX)
    {
        zoomValue += 6;
        setupMatrix();
    }
}

void View::zoomOut()
{
    if (zoomValue - ZOOMDELTAVALUE >= ZOOMMIN)
    {
        zoomValue -= 6;
        setupMatrix();
    }
}

// -----------------------------------------

    scene =  new QGraphicsScene(this);
    View *view = new View("", this);
    view->view()->setScene(scene);
    scene->addPixmap(QPixmap(":/icons/images/russia.png"));


Как сделать так, чтобы нельзя было уменьшить меньше, чем минимальный размер одной из сторон установленной на сцену картинки, ну и увеличить, например более чем на одну треть от минимальной стороны установленной картинки. Чтоб не было такой ситуации:

http://


3  Qt / Пользовательский интерфейс (GUI) / Re: QComboBox со строкой ввода : Июнь 09, 2022, 09:31
Тему Вы конечно подняли довольно таки спорную и холиварную.... ))

1 По поводу отключения автодополнения через флаг QCompleter мне кажется очень логичным, по аналогии с другими флагами фреймфорка, например QAbstractItemView::NoSelection.
2 Чекбоксы в комбобоксе расширяют его возможности до флага QAbstractItemView::MultiSelection в табличках. как по мне очень удобно там, где нет места для табличного представления.
3 .
Цитировать
Пусть принципы организации UI/UX сформулированы не нами, но чтобы их модифицировать, нужны весьма веские основания.
Да, например "требование дизайнера" является веским основанием или нет? В следующий раз отправлю им Вашу цитату Улыбающийся. В то же самое время разработчики фреймворка почему то не сделали UI классы final... А если пойти шире то многие "прокачивают" автомобили, а не ездят на стандартных комплектациях, многие делаю ремонт в квартирах а не живут в типовых коробочках  Улыбающийся Иногда бывает и так что приходится модифицировать стандартное поведение UI.
4 Как я понимаю форумы нужны для решения технических вопросов, с которыми некоторые люди не могут справиться по различным причинам. Если акцентироваться на "зачем делать", а не "как делать", то  99% тем, НЕ относящихся к категории "помогите новичку" можно закрыть с формулировкой "зачем тебе это надо так никто не делает".

Со всем уважением и спасибо за помощь в параллельных темах  Подмигивающий


4  Qt / Пользовательский интерфейс (GUI) / Re: QComboBox со строкой ввода : Июнь 08, 2022, 00:23
Спасибо за наводку ... не знал об этом классе

Для меня идеально подошло:
cblAir->lineEdit()->completer()->blockSignals(true);

Для будущих потомков: может кому то будет интересно поиграться с различными видами автодополнения
QCompleter::PopupCompletion   0   Current completions are displayed in a popup window.
QCompleter::InlineCompletion   2   Completions appear inline (as selected text).
QCompleter::UnfilteredPopupCompletion   1   All possible completions are displayed in a popup window with the most likely suggestion indicated as current.

Устанавливаются методом
void   setCompletionMode(QCompleter::CompletionMode mode)

Странно что по аналогии с другими флагами нет что то типа QCompleter::NoCompletion  Плачущий
5  Qt / Пользовательский интерфейс (GUI) / QComboBox со строкой ввода : Июнь 07, 2022, 17:13
Добрый день,
 
Использую QComboBox со свойством setEditable(true)
В данном режиме вверху комбобокса появляется lineEdit в кототом можно вводитьтекст
Данный lineEdit я использую для поиска и фильтрации значений в комбобокс.

Однако,  когда я ввожу текст, то Qt подставляет первый подходящий элемент из списка. Можно как то отключить это?

Скрин прикреплен по ссылке. В строку ввода я написал ".V", все остальное дописалось автоматически, что очень мешает, так как по сигналу currentTextChanged отслеживаю изменения текста.

https://disk.yandex.ru/i/ZJNeaHp6arnldg

6  Qt / Пользовательский интерфейс (GUI) / Re: QComboBox + CheckBox Delegate : Июнь 07, 2022, 16:57
Я впринципе разобрался, может кому будет полезно.
Сигнал об изменении (в моем случае выбор чекбокса в выпадающем списке) получаю не от делегата а из модели.
void QStandardItemModel::itemChanged(QStandardItem *item)



7  Qt / Пользовательский интерфейс (GUI) / Re: QComboBox + CheckBox Delegate : Июнь 07, 2022, 10:04
А как с этой... этим комбобоксом работать? Есть минимальный проект?

Почему то подумал что вы просите видео работы его )
Сегодня наткнулся на ответ и понял что Вы просите проект ))
Прикрепил, спасибо.

Меня смущают строки 33 и 45 filterDialog.h

Как избежать этого ворнинга
https://github.com/KDE/clazy/blob/1.10/docs/checks/README-const-signal-or-slot.md

Ну и вобще кажется что сам подход реализации неверен.
Проект доступен по ссылке:
https://disk.yandex.ru/d/Q5z-owgKKAguVg

Так же получая сигнал об изменении модели из метода делегата setModelData я оповещаю вью о всех изменениях элементов (в том числе об активации отдельных ячеек). Хотелось бы узнавать только об изменении состояния чекбокса.
8  Qt / Общие вопросы / Re: Выборка списка : Июнь 06, 2022, 22:17
Спасибо
9  Qt / Общие вопросы / Re: Выборка списка : Июнь 06, 2022, 21:36
Как всегда при решении проблемы углубился в дебри, хотя решение на поверхности
QStringList QStringList::filter(const QString &str, Qt::CaseSensitivity cs = Qt::CaseSensitive) const
В принципе метода выше вполне достаточно Улыбающийся

Однако для общего развития если кто-то подскажет как решить задачу с помощью QRegExp (необходима совместимость с Qt 4.Крутой буду благодарен.
10  Qt / Общие вопросы / Выборка списка : Июнь 06, 2022, 21:31
Добрый день, неожиданно столкнулся со следующей тривиальной задачей, безрезультативно отнявшей у меня довольно много времени

Есть QLineEdit в который пользователь вводит текст
Есть заполненный QStringList

Задача такая: при вводе строки в списке должны оставаться только те строки, которые начинаются с уже введеных в строку ввода символов.

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

11  Qt / Пользовательский интерфейс (GUI) / Re: QComboBox + CheckBox Delegate : Июнь 06, 2022, 18:39
Да, конечно


https://disk.yandex.ru/i/J_cX-kWAehPGSQ
12  Qt / Пользовательский интерфейс (GUI) / QComboBox + CheckBox Delegate : Июнь 04, 2022, 00:32
Есть выпадающий комбобокс с реализованным делегатом (итемы - чекбоксы)

Код:
class CheckBoxListDelegate;

class CheckBoxList: public QComboBox
{
    Q_OBJECT
 public:
    CheckBoxList(QString text, QWidget *widget = 0);
    virtual ~CheckBoxList();
    virtual void paintEvent(QPaintEvent *);
public slots:
    void SetDisplayText(QString strr);
    QString GetDisplayText() const;
private:
    CheckBoxListDelegate * delegate;
    QString m_DisplayText;
private slots:
    void act ();
};
CheckBoxList::CheckBoxList(QString text, QWidget *widget )
:QComboBox(widget),m_DisplayText(text)
{
    delegate = new CheckBoxListDelegate(this);
    view()->setItemDelegate(delegate);
    view()->setEditTriggers(QAbstractItemView::CurrentChanged);
    connect(delegate,SIGNAL(dataChanged()),this,SLOT(act()));
}


CheckBoxList::~CheckBoxList()
{
}


void CheckBoxList::act()
{
    emit activated(0);
}

void CheckBoxList::paintEvent(QPaintEvent *)
{
    QStylePainter painter(this);
    painter.setPen(palette().color(QPalette::Text));

    // draw the combobox frame, focusrect and selected etc.
    QStyleOptionComboBox opt;
    initStyleOption(&opt);

    // if no display text been set , use "..." as default
    if(m_DisplayText.isNull())
        opt.currentText = "...";
    else
        opt.currentText = m_DisplayText;
    painter.drawComplexControl(QStyle::CC_ComboBox, opt);

    // draw the icon and text
    painter.drawControl(QStyle::CE_ComboBoxLabel, opt);
}


void CheckBoxList::SetDisplayText(QString strr)
{
    m_DisplayText = strr;
}

QString CheckBoxList::GetDisplayText() const
{
    return m_DisplayText;
}
Делегат:
Код:
class CheckBoxListDelegate : public QItemDelegate
{
    Q_OBJECT
signals:
    void dataChanged () const;
public slots:
    void dCH ()
    {
        emit dataChanged();
    }
public:
    CheckBoxListDelegate(QObject *parent)
         : QItemDelegate(parent)
    {
    }

    void paint(QPainter *painter, const QStyleOptionViewItem &option,
                          const QModelIndex &index) const
    {
        //Get item data
        bool value = index.data(Qt::UserRole).toBool();
        QString text = index.data(Qt::DisplayRole).toString();

        // fill style options with item data
        const QStyle *style = QApplication::style();
        QStyleOptionButton opt;
        opt.state |= value ? QStyle::State_On : QStyle::State_Off;
        opt.state |= QStyle::State_Enabled;
        opt.text = text;
        opt.rect = option.rect;

        // draw item data as CheckBox
                style->drawControl(QStyle::CE_CheckBox,&opt,painter);
    }

    QWidget *createEditor(QWidget *parent,
         const QStyleOptionViewItem &,
         const QModelIndex &) const
    {
        // create check box as our editor
         QCheckBox *editor = new QCheckBox(parent);
         return editor;
    }

     void setEditorData(QWidget *editor,
                                         const QModelIndex &index) const
     {
         //set editor data
         QCheckBox *myEditor = static_cast<QCheckBox*>(editor);
         myEditor->setText(index.data(Qt::DisplayRole).toString());
         myEditor->setChecked(index.data(Qt::UserRole).toBool());

     }

     void setModelData(QWidget *editor, QAbstractItemModel *model,
                                        const QModelIndex &index) const
     {
         //get the value from the editor (CheckBox)
         QCheckBox *myEditor = static_cast<QCheckBox*>(editor);
         bool value = myEditor->isChecked();

         //set model data
         QMap<int,QVariant> data;
         data.insert(Qt::DisplayRole,myEditor->text());
         data.insert(Qt::UserRole,value);
         model->setItemData(index,data);
        emit dataChanged();
     }
 };

Использование во вью:
Код:
    QHBoxLayout * labLay = new QHBoxLayout (ui->gbLabel);
    cblLabel = new CheckBoxList (QString::fromLocal8Bit("Выберите метку ..."), ui->gbLabel);
    labLay->addWidget(cblLabel);
    connect(cblLabel,SIGNAL(activated(int)),this,SLOT(changedLabelSettings()));

ну и в конце концов данные в выпадающий список предостаялются моделью
Код:
cblLabel->setModel(metkaModel);

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

А так же коспилятор рисуте ворнинги напротив константных сигналов делегата и слота класса CheckBoxList. Однако константность убрать невозмоно так как сигнал эмитится констатнтным методом

Подскажите пожалуйста как сделать красиво.
13  Qt / Базы данных / Re: Соединение с несуществующей БД : Июнь 02, 2022, 07:11
Спасибо за подсказку Postgresql поддерживает опцию "connect_timeout"
14  Qt / Базы данных / Re: Работа с БД в отдельном потоке : Июнь 01, 2022, 23:20
Да, спасибо я знаю

Результат возвращаю во вью через указатель на QSqlQuery

Код:
void SqlQueryExecutor::slotGet618Data(uint turplesCount)
{
    if (!QSqlDatabase::database().isOpen())
    {
        emit dbDbErrorAppears(QSqlError::ConnectionError, tr("Ошибка подключения к БД."), "");
        return;
    }
    QSqlQuery * query618 = new QSqlQuery ();
    QString sty;
    if (turplesCount == 0)
        sty = QString ("%1 %2 ORDER BY id DESC ").arg(strQueryA618, strWhereA618);
    else
        sty = QString ("%1 %2 ORDER BY id DESC %3 %4").arg(strQueryA618, strWhereA618, "LIMIT").arg(turplesCount);
    query618->exec(sty);
    if (query618->lastError().isValid())
    {
        emit dbDbErrorAppears(query618->lastError().type(), query618->lastError().text(), "");
        return;
    }
    emit set618Data(query618);
}
15  Qt / Базы данных / Соединение с несуществующей БД : Июнь 01, 2022, 23:11
Коллеги, добрый день,
Как обработать ошибку ошибочного ввода IP сервера БД?

Довольно стандартная функция подключения к БД:
Код:
void SqlQueryExecutor::slotOpenDbConnection(QString address, QString serverName, QString login, QString password)
{
    if (QSqlDatabase::database().isOpen())
    {
        QString connectionName = QSqlDatabase::database().connectionName();
        QSqlDatabase::database(connectionName).close();
        QSqlDatabase::removeDatabase(connectionName);
    }
    QSqlDatabase db = QSqlDatabase::addDatabase("QPSQL");
    db.setHostName(address);
    db.setDatabaseName(dbName);
    db.setUserName(login);
    db.setPassword(password);
    if (!db.open())
    {
        if (db.lastError().isValid())
            emit dbDbErrorAppears(db.lastError().type(), db.lastError().text(), serverName);
        return;
    }
    emit dbConnected(serverName);
}

Когда на сервере развернута БД все ок, соединение устанавливается, либо не устанавливается по каким то причинам.
Но если мы подключаемся по несуществующему IP поток зависает на функции open на довольно продолжительное время.
и в конце концов получаю ответ

could not connect to server: Время ожидания соединения истекло
   Is the server running on host "10.248.0.2" and accepting
   TCP/IP connections on port 5432?
QPSQL: Unable to connect

Как это время можно сократить?
Страниц: [1] 2

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