QT 4: программирование GUI на С++
Шрифт:
Чтобы показать, как это делается, в данном разделе мы разработаем шестнадцатеричный наборный счетчик. Наборный счетчик QSpinBox поддерживает только десятичные целые числа, но путем создания подкласса достаточно легко можно заставить его принимать и отображать шестнадцатеричные значения.
Шестнадцатеричный
Мы устанавливаем по умолчанию диапазон от 0 до 255 (от 0x00 до 0xFF), который лучше соответствует шестнадцатеричному наборному счетчику, чем диапазон от 0 до 99, принимаемый по умолчанию в QSpinBox.
Пользователь может модифицировать текущее значение наборного счетчика, щелкая по верхней или нижней стрелке или вводя значения в строке редактирования наборного счетчика. В последнем случае мы хотим, чтобы пользователь мог вводить только правильные шестнадцатеричные числа. Для достижения этого мы используем QRegExpValidator, который принимает один или несколько символов со значениями каждого символа в диапазонах от «0» до «9», от «А» до «F» или от «а» до «f».
Эта функция вызывается в QSpinBox для проверки допустимости введенного текста. Результат может иметь одно из трех значений: Invalid (текст не соответствует регулярному выражению), Intermediate (текст, вероятно, является частью допустимого значения) и Acceptable (текст допустим). QRegExpValidator имеет подходящую функцию validate, поэтому мы просто возвращаем результат ее вызова. Теоретически следует возвращать Invalid или Intermediate для значений, лежащих вне диапазона наборного счетчика, но QSpinBox достаточно «умен» и может самостоятельно отследить эту ситуацию.
Функция textFromValue преобразует целое число в строку. QSpinBox
Функция valueFromText выполняет обратное преобразование из строки в целое число. Она вызывается в QSpinBox, когда пользователь вводит значение в строку редактирования наборного счетчика и нажимает клавишу Enter. Мы используем функцию QString::toInt для попытки преобразования текущего текстового значения (возвращаемого QSpinBox::text) в целое число, вновь используя 16 в качестве базы. Если строка не является правильным шестнадцатеричным числом, ok устанавливается на значение false и toInt возвращает 0. Здесь нет необходимости рассматривать такую возможность, поскольку контролирующая функция (validator) позволяет вводить только правильные шестнадцатеричные значения. Вместо передачи адреса переменной ok мы могли бы задать нулевой указатель в первом аргументе функции toInt.
Этим мы завершили создание шестнадцатеричного наборного счетчика. Настройка других виджетов Qt осуществляется по тому же образцу: подобрать подходящий виджет Qt, создать его подкласс и переопределить несколько виртуальных функций для изменения режима его работы.
Создание подкласса QWidget
Многие пользовательские виджеты являются простой комбинацией существующих виджетов, либо встроенных в Qt, либо других пользовательских виджетов (таких, как HexSpinBox). Если пользовательские виджеты строятся на основе существующих виджетов, то они, как правило, могут разрабатываться в Qt Designer.
• создайте новую форму, используя шаблон «Widget» (виджет);
• добавьте в эту форму необходимые виджеты и затем расположите их соответствующим образом;
• установите соединения сигналов и слотов;
• если необходима функциональность, которую нельзя обеспечить с помощью механизма сигналов и слотов, необходимый программный код следует писать в рамках класса, который наследует как класс QWidget, так и класс, сгенерированный компилятором uic.
Естественно, комбинация существующих виджетов может быть также полностью запрограммирована вручную. При любом подходе полученный класс наследует непосредственно QWidget.
Если виджет не имеет своих собственных сигналов и слотов и не переопределяет никакую виртуальную функцию, можно просто собрать виджет из существующих виджетов, не создавая подкласс. Этим методом мы пользовались в главе 1 для создания приложения Age с применением QWidget, QSpinBox и QSlider. Даже в этом случае мы могли бы легко определить подкласс QWidget и в его конструкторе создать QSpinBox и QSlider.