tutorial girona español curso c++ qt fonts editor qtextedit

c++ - girona - ¿Cómo anular el ancho de la pestaña en qt?



qgis manual (5)

Calcular un producto de un tamaño de un espacio y espacios numéricos no siempre es preciso (probado bajo macOS, fuente Monaco), probablemente debido a algunos espacios entre los caracteres en la cadena real. Una mejor solución sería medir la longitud de la cadena que contiene espacios tabStop:

const int tabStop = 4; // 4 characters QString spaces; for (int i = 0; i < tabStop; ++i) { spaces += " "; } QFontMetrics metrics(font); editor->setTabStopWidth(metrics.width(spaces));

Solo necesito saber cómo cambiar el tamaño de la pestaña en Qt en un QTextEdit . Mi búsqueda en Google y Home me devolvió nulo. Gracias por adelantado.


La propiedad QTextEdit::tabStopWidth podría resolver su problema (consulte here para la documentación ...)


Mientras que la pregunta sobre cómo establecer el ancho de tabulación ya ha sido respondida; el cálculo del ancho correcto de la pestaña en píxeles sigue siendo (¿o de nuevo?) una pregunta abierta.

Desde Qt 5.10 , QTextEdit::tabStopWidth se marca como obsoleto y se introdujo QTextEdit::tabStopDistance . tabStopWidth era entero, tabStopDistance es double .

¿Por qué tan complicado?

Establecer n * QFontMetrics::width('' '') como ancho de tabulación font_metrics.width problemas porque font_metrics.width devuelve un entero. Incluso si tiene una fuente estándar monoespaciada, el ancho de un solo carácter en realidad no es un número entero, por lo que QFontMetrics::width devuelve una medida inexacta. Si comparas la apariencia de las cuerdas ........| y /t/t/t/t| (/ t = tab, n = 2), verá que las tuberías no están alineadas correctamente. Se volverá peor cuanto más pestañas inserte.

Solución

Podría hacer lo que propuso @Ferdinand Beyer, pero cambiará ligeramente la tipografía. También tuve que adaptar su método para hacerlo funcionar. Sin embargo, hay un enfoque mucho más simple que explota que puede configurar tabStopDistance ahora con doble precisión:

static constexpr int tab_width_char = 2; m_text_edit->setFont(QFont("Courier", 12)); const auto font_metrics = m_text_edit->fontMetrics(); static constexpr int big_number = 1000; // arbitrary big number. const QString test_string(" "); // compute the size of a char in double-precision const int single_char_width = font_metrics.width(test_string); const int many_char_width = font_metrics.width(test_string.repeated(big_number)); const double single_char_width_double = many_char_width / double(big_number); // set the tab stop with double precision m_text_edit->setTabStopDistance(tab_width_char * single_char_width_double);

Esto sería mucho más simple si Qt ofreciera una forma de obtener el ancho de un solo carácter como double .


Si bien la solución de @Ferdinand Beyer funcionará en algunos sistemas, generalmente no se garantiza que las fuentes tengan métricas enteras. por ejemplo, 12pt DejaVu Sans Mono en mi configuración de Linux tiene un ancho de caracteres de 9.625. La mejor solución que he encontrado es agregar un poco de espacio entre letras para obtener una alineación perfecta de píxeles.

int tabstop = 4; QFontMetricsF fm (ui->textEdit->font()); auto stopWidth = tabstop * fm.width('' ''); auto letterSpacing = (ceil(stopWidth) - stopWidth) / tabstop; auto font = ui->textEdit->font(); font.setLetterSpacing(QFont::AbsoluteSpacing, letterSpacing); ui->textEdit->setFont(font); ui->textEdit->setTabStopWidth(ceil(stopWidth));


Si desea crear un editor de código fuente utilizando QTextEdit , primero debe asignar una fuente de ancho fijo (monoespaciado). Esto asegura que todos los personajes tengan el mismo ancho:

QFont font; font.setFamily("Courier"); font.setStyleHint(QFont::Monospace); font.setFixedPitch(true); font.setPointSize(10); QTextEdit* editor = new QTextEdit(); editor->setFont(font);

Si desea establecer un ancho de tabulación para cierta cantidad de espacios, como se hace normalmente en los editores de texto, use QFontMetrics para calcular el tamaño de un espacio en píxeles:

const int tabStop = 4; // 4 characters QFontMetrics metrics(font); editor->setTabStopWidth(tabStop * metrics.width('' ''));