Выравниваем содержимое tcombobox по правую сторону


ComboBox — текст выравнивается справа

Выравниваю текст по правому краю :

1) Установить в Style lbOwnerDrawFixed
2) B обработчике onDrawItem cделать следующее:

Добавляю строку программно
комбобокс вставляет ее в Items ,
а в поле текст ничего не отображает

как это побороть .
( полю text присваивал значение — не помагает )

Код работает , но есть косяк
вставляю-

Текстовое поле ComBobox остается пустым
А вот теперь если дропдаун нажать,
то там уже наша запись сидит и отлично выбирается
и потом соотвесвенно отображается

А мне хочется чтобы она сразу в тексте отображалась .

Кстати при таком лечение поле текст становится «безчувственным» к редактированию .

Цитата (Denchik @ 3.3.2008, 06:06 )
Текстовое поле ComBobox остается пустым

А вот теперь если дропдаун нажать,

то там уже наша запись сидит и отлично выбирается

и потом соотвесвенно отображается

Вот такой вызов работает отлично

Осталось побороть бесчувственность при редактировании

Как прижать flex-контейнер к правой стороне?

Доброго времени суток! Вот есть такое меню:

Все пункты меню это li в ul, то есть списком. Вот CSS:


Каждый li тоже flex-контейнер получается (если я правильно понимаю). Мне нужно сделать для двух последних так сказать float: right. Но я что то не могу понять как это сделать. ul у меня на всю ширину растянут, то есть куда их двигать места хватает. Пробовал разные justify и align но чего то не получается :(
Подскажите как правильно это реализовать. Заранее спасибо!

Создание моделей данных для QComboBox

Всем привет! Хочу поделиться с вами двумя способами, как можно и нужно создавать модели данных для виджетов типа QComboBox в Qt. В конце статьи будет показано решение, для заполнения комбобокса из БД, одной строкой кода.

Все модели данных в Qt должны быть наследниками от QAbstractItemModel. Лично в моей практике комбобоксы всегда отображали перечисление из SQL базы данных. Это были пол, страна, национальность и некоторые другие списки, из которых пользователю нужно было выбрать один пункт. Поэтому, при создании модели, у меня всегда было две параллельных задачи:

  1. Как сформировать человекочитаемые названия пунктов пользователю?
  2. Как связать читаемые пункты с ключами, которые надо писать в БД?

На всякий случай поясню разницу, если кому не понятно. Первый пункт это человекочитаемое название пункта. В моём примере комбобокс для выбора национальностей. Там будут слова типа «Russian», «Belgian», «Norwegian» и т.п. То что пользователь программы увидит на экране. Второе это то что программа будет записывать в базу данных. Условно «служебное значение». В моём примере в базу пишется строка типа: «russian», «belgian», «norwegian». Это позволяет менять видимые пользователю названия пунктов без лишних хлопот. Например, дали вам задание уменьшить ширину комбобокса, за счёт сокращения названий национальностей. Вам надо показывать не «Russian», а «Rus.». В этом случае вы спокойно меняете текст выводимый для пользователя и закрываете задачу. Если же в базу писать прямо то что видно в комбобоксе. Изменние «Russian» -> «Rus.» заставит писать процедуры для базы данных. С целью перевода старых имен в новые. Что бы не потерялись уже выбранные национальности в базах конечных пользователей. Короче два описанных названия(человекочитаемое, служебное) для каждого пункта. Это хорошая практика создания поддерживаемого кода.

Для реализации замысла. Первым делом надо посмотреть какие из методов QAbstractItemModel, вы обязаны определить у себя:

  • QModelIndex QAbstractItemModel::index(int row, int column, const QModelIndex & parent = QModelIndex()) const
  • QModelIndex QAbstractItemModel::parent(const QModelIndex & index) const
  • int QAbstractItemModel::columnCount(const QModelIndex & parent = QModelIndex()) const
  • int QAbstractItemModel::rowCount(const QModelIndex & parent = QModelIndex()) const
  • QVariant QAbstractItemModel::data(const QModelIndex & index, int role = Qt::DisplayRole) const

Т.е. здесь перечислены «полностью виртуальные»(«pure virtual») методы. Казалось бы самым странным придётся реализовывать columnCount(). Т.к. очевидно что колонка одна. Потом index() и parent() выглядят как то избыточно, на фоне простой линейной структуры данных(список). Они нужны больше для построения иерархических моделей типа деревьев для QTreeView. Поэтому, что бы не выдумывать себе лишнюю работу, было решено наследовать класс модели от QAbstractListModel, который тоже годен в нашем случае. И требует реализовать только два последних(«pure virtual») метода из списка.

Таким образом, для комбобокса выбора национальности. Получается следующая реализация модели:

Все значения пунктов комбобокса, просто записываються в QList Как скачать код с github.com

Способ №2. Быстрое создание модели из перечисления в SQL БД

Конечно же самый правильный способ организации перечислений. Это хранить их в базе, в виде отдельных таблиц. И подгружать в комбобоксы в конструкторах форм. И было бы идеально иметь какое-то универсальное решение. Вместо написания отдельных классов моделей, для каждого перечисления.

Для реализации нам потребуется QSqlQueryModel. Это похожая модель. Она тоже наследник QAbstractItemModel, но используется для отображения результатов SQL запроса QSqlQuery в таблице QTableView. В данном случае, наша задача приспособить данный класс. Что бы он давал данные так же как в первом примере.

Вы удивитесь, но код получился небольшим.

В данной реализации, всю работу делает QSqlQueryModel. Надо только немного переопределить логику QSqlQueryModel::data(). Для начала представьте, что в модель записывается SQL запрос «SELECT country.id, countryname || ‘ — ‘ || countrycode FROM country».

Конечно в коде проекта это немного более замысловато. Но если отладить там будет сформирована именно такая строка. Запрос выводит два столбца. Первичный ключ(«id»). И человекочитаемое значние, видимое на скриншоте. Поскольку все результаты SQL запроса оказываются в Qt::DisplayRole у QSqlQueryModel. То без изменения QSqlQueryModel, в качестве модели комбобокса, выдаст просто список «id». А человекочитаемое значение не будет видно. Т.к. комбобокс никак не использует второй столбец модели(запроса). Вы это увидите, если закомментируете объявление и реализацию BaseComboModel::data().


Для того что бы увидеть список стран, как на скриншоте, BaseComboModel::data():

  • возвращает данные первого запрошенного столбца(«id») как Qt::UserRole первого столбца
  • возвращает данные второго столбца(«countryname || ‘ — ‘ || countrycode») как Qt::DisplayRole первого столбца
  • добавляет строку «(please select)» в самом начале. За счёт смещения номеров при запросе данных от QSqlQueryModel. Т.е. к результатам SQL запроса, модель сама добавляет ещё одну строку

Таким образом вы можете быстро и легко делать модели для QComboBox-а с помощью BaseComboModel. Например, у вас есть SQL таблица месяцев в году(«months»). Где два столбца, «id» и «monthname». Вам можно заполнить комбобокс выбора месяца следующим образом:

ui->monthsCombo->setModel( new BaseComboModel( «monthname», «months», this ) );
Получить значение «id» выбранного месяца ui->monthsCombo->itemData( ui->monthsCombo->currentIndex(), Qt::UserRole );. Получть значение видимое пользователю ui->monthsCombo->currentText();. Этот код гораздо компактнее всех остальных случаев. Большинство разработчиков в данной ситуации пишут, отдельно запрос к базе (QSqlQuery). А потом, в цикле, добавляют полученные записи в комбобокс, через QComboBox::addItem(). Это конечно рабочее, но не самое красивое решение.

Практика

Подозреваю, не все поняли как тут всё устроено и работает. Просто потому что для этого нужен очень специфический опыт реализации своих моделей. В этом случае, что бы ваше время на статью не пропало даром. Давайте просто попробуем использовать приведённый код на практике. Что бы потом, со временем понять его.

Два варианта как это сделать:

    Эксперименты на основе моего приложения — адресной книги, упомянутой выше. Заголовок и реализация BaseComboModel уже присутствуют в проекте. Примеры ниже, будут на её основе.

  • Использовать любое другое приложение работающее с SQL БД. Это не обязательно должна быть SQLite. Подойдёт любая база! Вы можете просто вставить код из листинга выше, в файл реализации любой формы.
    Конечно, было бы правильно сделать отдельные файлы, заголовочный и реализацию для BaseComboModel. Будем считать что пока нам это делать лень. Вам конечно придётся немного побороться с ошибками компиляции. Но они будут простыми. В таблицах, из которых вы будете брать данные для комбобокса. Обязан присутствовать столбец «id»
  • Параметры конструктора BaseComboModel( const QString &columns, const QString &queryTail, QObject *parent = 0 ):

      const QString &columns. Формирование человекочитаемого названия пункта для пользователя. В примере выше «countryname || ‘ — ‘ || countrycode» применяется конкатенация двух столбцов через дефис. Оператор конкатенации «||» специфичный для SQLite. Можно указать несколько столбцов через запятую. Но показываться будет только первый.

  • const QString &queryTail. «Хвост» запроса. Содержимое SQL запроса после «FROM». Очевидно, в этой строке, сначала должно быть имя таблицы из которой будут браться данные. Но потом можно добавить условие «WHERE» и ещё много всего

  • Далее, надо добавить на форму QComboBox с которым вы будете экспериментировать. В моём случае это будет addressbookmainwindow.ui. Имя нового виджета ui->comboBox

    Теперь будем заполнять этот комбобокс разными способами

    ui->comboBox->setModel( new BaseComboModel( «countryname», «country», this ) );
    «SELECT country.id, countryname FROM country».
    Просто список стран
    ui->comboBox->setModel( new BaseComboModel( «countryname», «country WHERE countrycode IN ( ‘US’, ‘RU’, ‘CN’ )», this ) );
    «SELECT country.id, countryname FROM country WHERE countrycode IN ( „US“, „RU“, „CN“ )».
    Некоторые страны выбранные по коду.
    ui->comboBox->setModel( new BaseComboModel( «lastname», «persons», this ) );
    «SELECT persons.id,, lastname FROM persons».
    Список фамилий записанных в базе. Что бы они были, надо кликнуть кнопку «Fill test data»
    ui->comboBox->setModel( new BaseComboModel( «lastname || ‘ — ‘ || email», «persons LEFT JOIN address AS a ON a. > «SELECT persons. > Список фамилий с email aдресами. Не забывайте что «||» оператор конкатенации строк только в SQLite. Для других баз понадобится переделать конкатенацию
    ui->comboBox->setModel( new BaseComboModel( «lastname || ‘ — ‘ || countryname», «persons INNER JOIN address AS a ON a. > «SELECT persons. > Список фамилий с соответствующими странами

    Конечно, все эти фокусы с «JOIN» и «WHERE» выглядят интересно. Но в большинстве случаев не нужны. Поэтому и было решено использовать два параметра в конструкторе. Вместо того чтобы подавать туда SQL запрос целиком. Если вы храните все перечисления в одной таблице. И разделяете эти перечисления по какому-то дополнительному ключу. Лучше сделать третий параметр, со значением этого ключа. Вместо того чтобы использовать каждый раз «WHERE».

    Повторюсь, как получить «id» выбранной записи
    ui->comboBox->itemData( ui->comboBox->currentIndex(), Qt::UserRole );

    Заключение

    Надеюсь, несмотря на сложность кода. Вы извлекли что то полезное для себя. Если хотите узнать больше о приложении «AddressBook» приведённом здесь ради примера. Смотрите статью «Автоматизация обмена данными Qt форм с SQL базой данных».

    Есть ли способ правильно выровнять текст в JCombobox

    Я хочу иметь JComboBox с правым выравниванием. как я могу это сделать? кто-то раньше сказал: «Вы можете установить рендерер на JComboBox, который может быть JLabel с JLabel#sethorizontalignment(JLabel.Правильно) » но я не знаю, как я могу это сделать?

    3 ответов

    кто-то раньше сказал: «Вы можете установить рендерер в JComboBox, который может быть JLabel с jlabel#sethorizontalignment(JLabel.Правильно)»

    да, по умолчанию renederer является JLabel, поэтому вам не нужно создавать пользовательский рендерер. Вы можете просто использовать:

    Ну, вы можете сделать с ListCellRenderer, как это:

    это сработало для меня красиво и коротко

    чтобы избежать сеттеров при каждом вызове paint(Graphics), вы также можете использовать анонимный блок конструктора:

    Выровнять текст в Combobox

    Я хочу выровнять свой текст в поле со списком, чтобы он отображался в центре combobox, скажите мне, как это сделать, также вы можете увидеть, что есть граница по умолчанию вокруг поля со списком, когда он находится в фокусе, как я могу удалить эту границу также Пожалуйста, решите мои две проблемы Спасибо

    6 ответов


    Это не поддерживается для ComboBox. Точные причины теряются в тумане времени, ComboBox существует с начала девяностых, но, безусловно, имеет какое-то отношение к неловкости получения текста в части текстового поля, чтобы выровняться с текстом в раскрывающемся списке. Пользовательский чертеж с DrawItem также не может его решить, что влияет только на внешний вид раскрывающихся элементов.

    в качестве возможного обходного пути вы могли бы сделать что-то диковинное, например, заполнить элемент строки с пробелами, чтобы они посмотреть по центру. Вам понадобится TextRenderer.MeasureText (), чтобы выяснить, сколько пробелов добавить для каждого элемента.

    «граница», о которой вы говорите, не является границей, это прямоугольник фокуса. Вы также не можете избавиться от этого, Windows отказывается позволить вам создать пользовательский интерфейс, который не будет показывать элемент управления с фокусом. Пользователи, которые предпочитают клавиатуру мыши, заботятся об этом. Нет обходного пути для этого.

    фокус в том, чтобы установить DrawMode — свойство ComboBox to OwnerDrawFixed а также подписаться на его событие DrawItem .

    ваше событие должно содержать следующий код:

    чтобы выровнять элементы, которые вы можете просто заменить StringAlignment.Center С StringAlignment.Far .

    задайте свойству ‘RightToLeft’ значение true. Он не меняет последовательность символов. Это только справедливо-оправдывает.

    вы не можете сделать это в Windows form control специально поле со списком

    Winforms довольно негибкий, когда дело доходит до настройки элементов управления. Если вы ищете более настраиваемый пользовательский интерфейс, я рекомендую вам изучить создание приложения WPF, которое позволяет определять пользовательские элементы управления. Это займет некоторую работу, поэтому это только то, что вы захотите предпринять, если вы действительно найдете это необходимым. Вот достойный сайт, чтобы вы началиhttp://www.wpftutorial.net/

    вы можете сделать что-то подобное, добавив пробел перед членами дисплей в запросе

    Элемент управления ComboBox ComboBox control

    Объединяет функции ListBox и TextBox. Combines the features of a ListBox and a TextBox. Пользователь может ввести новое значение, как в случае с TextBox, или пользователь может выбрать существующее значение, как с помощью элемента управления ListBox. The user can enter a new value, as with a TextBox, or the user can select an existing value, as with a ListBox.

    Примечания Remarks

    Если компонент ComboBox привязан к источнику данных, объект ComboBox вставляет значение, которое пользователь введет или выбирает в источнике данных. If a ComboBox is bound to a data source, the ComboBox inserts the value the user enters or selects into that data source. Если поле со списком с несколькими столбцами привязано, свойство BoundColumn определяет, какое значение хранится в связанном источнике данных. If a multi-column combo box is bound, the BoundColumn property determines which value is stored in the bound data source.

    Список в ComboBox состоит из строк данных. The list in a ComboBox consists of rows of data. Каждая строка состоит из одного или нескольких столбцов с заголовками (или без них). Each row can have one or more columns, which can appear with or without headings. Некоторые приложения не поддерживают заголовки столбцов, другие — поддерживают только частично. Some applications do not support column headings, others provide only limited support.

    Свойством ComboBox по умолчанию является Value. The default property of a ComboBox is the Value property. Событием ComboBox по умолчанию является Change. The default event of a ComboBox is the Change event.

    Если требуется, чтобы в списке всегда отображалось несколько строк, вместо компонента ComboBoxможет потребоваться использовать элемент управления ListBox . If you want more than a single line of the list to appear at all times, you might want to use a ListBox instead of a ComboBox. Если вы хотите использовать ComboBox и ограничить значения в списке, вы можете задать свойство Style элемента ComboBox , чтобы элемент управления выглядел как раскрывающийся список. If you want to use a ComboBox and limit values to those in the list, you can set the Style property of the ComboBox so the control looks like a drop-down list box.


    См. также See also

    Поддержка и обратная связь Support and feedback

    Есть вопросы или отзывы, касающиеся Office VBA или этой статьи? Have questions or feedback about Office VBA or this documentation? Руководство по другим способам получения поддержки и отправки отзывов см. в статье Поддержка Office VBA и обратная связь. Please see Office VBA support and feedback for guidance about the ways you can receive support and provide feedback.

    Стили отображения ComboBox

    Читайте также:

    1. TComboBox — раскрывающийся список выбора
    2. Z4.3. ТЕОРИИ ЛИДЕРСТВА И СТИЛИ РУКОВОДСТВА
    3. Виды элементов отображения
    4. Вопрос 1. Вербальные коммуникации. Функциональные стили речи.
    5. Для отображения в диапазонах анимации различных типов ключевых кадров свойств щелкните диапазон
    6. Задачи стилистики
    7. Задачи стилистики
    8. ИЗ. ТЕОРИИ ЛИДЕРСТВА И СТИЛИ РУКОВОДСТВА
    9. Изменение отображения кадров на временной шкале
    10. Исторические стили жилища
    11. Книжные стили
    12. Когнитивные стили

    Элемент управления ComboBox

    Доступ к элементам списка

    Для получения доступа к выбранному элементу списка типа ListBox можно использовать свойство Text.

    Чтобы получить доступ к элементам списка, используйте свойство List. Значения этого свойства являются массивом, размерность которого равна значению свойства ListCount, то есть количеству элементов в списке. Например, значение первого элемента списка будет равно Listl.List(0), второго — List1.List (1) и т.д.

    Для определения положения элемента в списке типа ListBox можно использовать свойство ListIndex. Например, при выборе первого элемента списка значение свойства ListIndex будет равно 0.

    Списки типа СоmbоВох называют раскрывающимися или полями со списком. Оба этих названия верны. Раскрывающимися их называют потому, что для выбора значения из списка, имеющего установленные по умолчанию свойства, сначала необходимо открыть список, нажав кнопку со стрелкой, расположенную с правой стороны поля ввода. Второе название поле со списком они получили потому, что список типа ComboBox совмещает функции списка и поля ввода. Иными словами, можно не только выбирать данные из списка, но и вводить в поле ввода в верхней части новые значения. Использование списков ListBox дает возможность выдавать большой объем информации, экономя при этом место в форме.

    Стилем оформления списка типа ComboBox управляет свойство Style. Оно может принимать значения, представленные в табл. 8.1.

    Таблица 8.1. Значения свойства Style

    Значение свойства Описание
    0-Dropdown Combo Стиль, используемый по умолчанию. Данный список показан на рис. 6.1 слева. Пользователь может ввести значение в текстовое поле, расположенное в верхней части списка, либо открыть список, нажав кнопку с направленной вниз стрелкой с правой стороны поля, и выбрать требуемое значение. Выбранное значение переносится в текстовое поле
    1-Simple Combo Вид данного списка показан на рис. 6.1 в центре. При данном значении список отображается в форме в открытом состоянии. Если все элементы в нем не помещаются, появляется вертикальная полоса прокрутки. Пользователь может ввести значение в текстовое поле, располагающееся в верхней части списка, либо выбрать требуемое значение, которое будет перенесено в текстовое поле
    2-Dropdown List Вид данного списка показан на рис. 6.1 справа

    Рисунок. 8.1. Стили оформления списка типа ComboBox

    Дата добавления: 2014-12-23 ; Просмотров: 311 ; Нарушение авторских прав? ;


    Выровнять текст в Combobox

    Я хочу выровнять свой текст в поле со списком, чтобы он показывал в центре поля со списком подсказки, как это сделать, и вы можете видеть, что по умолчанию используется поле со списком, когда оно находится в фокусе, как я могу удалить эта граница также Пожалуйста, решите мои две проблемы Благодаря

    Это не поддерживается для ComboBox. Точные причины теряются в тумане времени, ComboBox существует с начала девяностых годов, но, безусловно, имеет какое-то отношение к неловкости получения текста в текстовом поле, чтобы выстроить текст в раскрывающемся списке. Пользовательский чертеж с DrawItem также не может его решить, что влияет только на внешний вид выпадающих элементов.

    Как возможное обходное решение, возможно, вы можете сделать что-то диковинное, например, заполнить строки элементов пробелами, чтобы они выглядели по центру. Вам понадобится TextRenderer.MeasureText(), чтобы выяснить, сколько пробелов нужно добавить для каждого элемента.

    «Граница», о которой вы говорите, не является границей, это прямоугольник фокуса. Вы также не можете избавиться от этого: Windows отказывается создавать пользовательский интерфейс, который не будет отображать элемент управления с фокусом. Пользователи, которые предпочитают клавиатуру над мышью, об этом заботятся. Нет обходного пути для этого.

    ComboBox

    Иерархия наследования

    Описание

    Компонент ComboBox представляет собой комбинированный список, объединяющий функции компонентов ListBox и EditBox.

    Работа с компонентом

    Компонент позволяет пользователю выбрать значение из списка или задать собственное.

    Отличие компонента ComboBox от схожего по функциям компонента ListBox заключается в следующем:

    ComboBox разрешает пользователю вводить собственные значения;

    ComboBox может быть как развернутым, так и свернутым (ListBox всегда развернут);

    ComboBox не допускает множественного выбора.

    Основное свойство компонента — Items. Заполнить данный список можно во время разработки (проектирования) формы, для этого следует нажать кнопку с многоточием около свойства в окне « Инспектор объектов » либо в контекстном меню компонента выбрать пункт « Элементы ».

    Основное событие компонента OnChange наступает при изменении текста в окне редактирования в результате прямого редактирования или в результате выбора из списка.


    Стиль отображения компонента определяется свойством Style.

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

    Индекс выбранного пользователем элемента можно определить по значению свойства ItemIndex.

    Выравниваем содержимое tcombobox по правую сторону

    На этом шаге мы рассмотрим компонент TComboBox

    Компонент TComboBox ( Комбинированный список ) представляет собой вариант списка с присоединенным дополнительным полем, в котором отображается выбранный элемент списка. Это же поле может использоваться для ввода новых элементов или для быстрого поиска элемента по начальным символам. Если на экране отображается только поле без списка, то для раскрытия списка можно использовать комбинацию клавиш Alt+вниз , а для выбора элемента списка используются клавиши перемещения (клавиши со стрелками).

    Компонент TComboBox работает в пяти разных режимах , определяемых значением свойства Style .

    Перечислим возможные значения свойства Style компонента TComboBox .

    Вводимый текст может автоматически преобразовываться к верхнему регистру (если свойство CharCase имеет значение ecUpperCase ), к нижнему ( ecLowerCase ) или никак не преобразовываться ( ecNormal по умолчанию).

    Максимальное число элементов, одновременно отображаемых в видимой части списка, задается в свойстве DropDownCount . Чтобы открыть список из программы, свойству DroppedDown ( Раскрыть ) надо присвоить значение True .

    Понятия выделенная строка в раскрывающемся списке нет. В нем имеется только текущая выбранная строка (ее номер в списке хранится в свойстве ItemIndex ). Соответственно нельзя и выделять строки списка. Единственный метод, связанный с выделением данных, — это процедура SelectAll , которая выделяет весь текст, введенный пользователем в присоединенное поле. При работе с раскрывающимся списком наиболее важными являются перечисленные ниже события.

    Перечислим основные события компонента TComboBox .

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

    Поместите на форму компоненты: Label1 , ComboBox1 . Для Form1 создайте обработчик OnCreate :

    Для компонента ComboBox1 — обработчик OnSelect :

    Если вы все сделали правильно, то у вас получится следующее:

    Приведем текст программы

    На следующем шаге мы рассмотрим компонент TScrollBar

    Илон Маск рекомендует:  Что такое код is_float
    Понравилась статья? Поделиться с друзьями:
    Кодинг, CSS и SQL