Улучшение принятого ответа о QPlainTextEdit
. В дополнение к lineSpacing
значение для setFixedHeight
должно содержать: 2 поля лежащих в основе QTextDocument
, 2 ширины кадра и поля содержимого виджета. Кроме того, QFontMetrics
должен быть получен из шрифта документа, а не из самого виджета. Итак, гипотетическая функция setHeight
должна выглядеть следующим образом:
void setHeight (QPlainTextEdit *ptxt, int nRows)
{
QTextDocument *pdoc = ptxt->document ();
QFontMetrics fm (pdoc->defaultFont ());
QMargins margins = ptxt->contentsMargins ();
int nHeight = fm.lineSpacing () * nRows +
(pdoc->documentMargin () + ptxt->frameWidth ()) * 2 +
margins.top () + margins.bottom ();
ptxt->setFixedHeight (nHeight);
}
Вам нужно указать строку даты как дату xs: date, чтобы иметь возможность сравнивать их таким образом. Форматирование с использованием fn:format-date()
просто создает строку, а fn:current-date()
возвращает xs: date. Этот фрагмент выполняет то, что вы хотите, но вы можете также рассмотреть сохраняющиеся данные в своем документе в формате xs: date, то есть <date>2016-12-31</date>
.
let $doc :=
<root>
<date>12/31/2016</date>
</root>
let $date-string := $doc/date/text()
let $date-parts := fn:tokenize($date-string,"/")
(: rearrange date parts into yyyy-mm-dd string and cast as xs:date :)
let $date := xs:date(fn:concat($date-parts[3],"-",$date-parts[1],"-",$date-parts[2]))
let $today := fn:current-date()
return $date le $today
=> false
Если дата сохраняется в формате xs: date, ее можно упростить следующим образом:
let $doc :=
<root>
<date>2016-12-31</date>
</root>
return xs:date($doc/date/text()) le fn:current-date()
Затем вы также можете использовать индекс диапазона на дату элемент, чтобы использовать cts:element-range-query()
для выбора документов, соответствующих вашим критериям и т. д., когда дата сохраняется таким образом.
Что вы сделали в своем коде, создается 2 xs: строковые переменные, а затем сравниваются с ними lexicaly. (например, «12/31/2016» по сравнению с «мм / дд / гггг»). Это будет сравниваться в соответствии с локалью, поскольку строка сравнивает не сопоставление даты. Есть только несколько форматов, которые сравнивают lexicaly так же, как и введенное значение даты, xs: date является одним из них, его формат - YYYY-MM-DD, который обладает свойством быть сравнимой лексикой, а также типизированной датой. В общем, предпочтительнее не полагаться на это и вместо этого конвертировать в xs: date или xs: dateTime и сравнивать значение dateTime. - Процедура такая же, вам нужно принуждать эти текстовые значения в стандартную форму даты либо с помощью xdmp : parse-dateTime () или аналогичные функции с учетом формата, или путем разбора текстового формата и получения формата xs: date (). Затем сравните два типизированных значения даты.
Я использовал нижний подход -
let $doc := <root>
<date>12/31/2016</date>
</root>
let $date := fn:format-date(xs:date(xdmp:parse-dateTime([Y0001]/[M01]/[D01]",$doc/date/text())),"[Y0001]/[M01]/[D01]")
let $today := fn:format-date(fn:current-date(),"[Y0001]/[M01]/[D01]")
return $date le $today