void SubWindow::elideText( QLabel *label, QString text ) { QFontMetrics metrix( label->font() ); int width = label->width() - 2; QString clippedText = metrix.elidedText( text, Qt::ElideRight, width ); label->setText( clippedText ); }
void TimerWidget::setEllipsisTextToLabel(QLabel *label, QString text) { updateCoverLabel(ui->description->currentText()); QFontMetrics metrix(label->font()); int width = label->width() - 4; QString clippedText = metrix.elidedText(text, Qt::ElideRight, width); label->setText(clippedText); }
bool Parameters::DrawResults(QPainter &painter, QRect &free_rect ) const { QFont title_font = painter.font(); title_font.setFamily("Arial"); title_font.setPointSize(14); QFont text_font = title_font; text_font.setPointSize( 12 ); auto DrawRowCenter = [ &painter, &free_rect ]( QFont font, QColor color, QString text, double spase = 1 ) { painter.save(); QFontMetrics metrix( font ); QRect place; AllocatePlace( place, metrix.height()*spase ,free_rect ); QPoint start_point( place.center().x() - metrix.width( text ) / 2, place.center().y() +metrix.height()/2); painter.setFont( font ); painter.setPen( color ); painter.drawText( start_point, text ); painter.restore(); }; auto DrawRowCenter2 = [ &painter, &free_rect ]( QFont font, QColor color, QString text, QColor color2, QString text2, double spase = 1 ) { painter.save(); QFontMetrics metrix( font ); QRect place; AllocatePlace( place, metrix.height()*spase ,free_rect ); QPoint start_point( place.center().x() - ( metrix.width( text ) + metrix.width( text2 ) ) / 2, place.center().y() +metrix.height()/2); QPoint start_point2( start_point.x() + metrix.width(text), start_point.y() ); painter.setFont( font ); painter.setPen( color ); painter.drawText( start_point, text ); painter.setPen( color2 ); painter.drawText( start_point2, text2 ); painter.restore(); }; auto DrawRowLeft = [ &painter, &free_rect ]( QFont font, QColor color1, QString label, double spase = 1 ) { painter.save(); QFontMetrics metrix( font ); QRect place; AllocatePlace( place, metrix.height()*spase, free_rect ); QPoint start_point( place.left() , place.center().y()+metrix.height()/2 ); painter.setFont( font ); painter.setPen( color1 ); painter.drawText( start_point, label ); painter.restore(); }; auto DrawRowLeft3 = [ &painter, &free_rect ]( QFont const& font, QColor const& color1, QString const& label, QColor const& color2 = Qt::black, QString const& value = "", QColor const& color3 = Qt::black, QString const& value2 = "", double spase = 1) { painter.save(); QFontMetrics metrix( font ); QRect place; AllocatePlace( place, metrix.height()*spase, free_rect ); QPoint start_point( place.left() , place.center().y()+metrix.height()/2 ); QPoint start_point2( start_point.x() + metrix.width(label), place.center().y() +metrix.height()/2); QPoint start_point3( start_point2.x() + metrix.width(value), place.center().y() +metrix.height()/2); painter.setFont( font ); painter.setPen( color1 ); painter.drawText( start_point, label ); painter.setPen( color2 ); painter.drawText( start_point2, value ); painter.setPen( color3 ); painter.drawText( start_point3, value2 ); painter.restore(); }; DrawRowCenter( title_font, Qt::black, "", 7 ); DrawRowCenter( title_font, Qt::black, "Результаты испытаний", 1 ); DrawRowCenter2( title_font, Qt::black, "дискретного аппарата ", Qt::red, mGsType, 2 ); QString header = "<html>" "<head>" "<meta charset='utf-8'>" "<style type='text/css'>" "td { text-align: center;}" "th { font-weight: normal; padding: 2px;}" "table {border-collapse: collapse; border-style: solid; vertical-align:middle;}" "</style>" "</head>" "<body>" "<table width='100%' border='1.5' cellspacing='-0.5' cellpadding='-0.5'>" "<tr>" "<th> Номер </th>" "<th></th>" "<th> Работоспособность </th>" "</tr>"; QString footer = "</table>" "</body>" "</html>"; bool sucsess = true; QString row; for ( auto it = mTestCase.begin(), end = mTestCase.end(); it != end; ++it ) { Test* ptr = *it; row += "<tr>" "<td>"+test::ToString( ptr->Number() )+"</td>" "<td>"+ QString(ptr->Name()).replace("\n","<br>") +"</td>" "<td style='font-size:28pt; color: \"red\"; font-weight:bold;'>"+ (ptr->Success() ? QString("+"):QString("-")) +"</td>" "</tr>"; sucsess &= ptr->Success(); } QTextDocument doc; doc.setUndoRedoEnabled( false ); doc.setTextWidth( free_rect.width() ); doc.setUseDesignMetrics( true ); doc.setDefaultTextOption ( QTextOption (Qt::AlignHCenter ) ); doc.setHtml( header + row + footer ); auto h = doc.documentLayout()->documentSize().height(); QRect place; AllocatePlace( place, h ,free_rect ); QRectF r( 0, 0, place.width(), place.height() ); painter.save(); painter.translate( place.topLeft() ); doc.drawContents( &painter, r); painter.restore(); DrawRowLeft( text_font, Qt::black, "ИТОГ:", 3 ); DrawRowLeft3( text_font, Qt::black, "Гидроаппарат ", Qt::red, mGsType + (sucsess? " годен": " не годен"), Qt::black, " к эксплуатации", 1 ); return true; }
bool Parameters::Draw(QPainter &painter, QRect &free_rect, QString const& compare_width ) const { QFont title_font = painter.font(); title_font.setFamily("Arial"); title_font.setPointSize(18); QFont level_font = title_font; level_font.setPointSize( 14 ); QFont text_font = title_font; text_font.setPointSize( 12 ); auto DrawRowCenter = [ &painter, &free_rect ]( QFont font, QColor color, QString text, double spase = 1 ) { painter.save(); QFontMetrics metrix( font ); QRect place; AllocatePlace( place, metrix.height()*spase ,free_rect ); QPoint start_point( place.center().x() - metrix.width( text ) / 2, place.center().y() +metrix.height()/2); painter.setFont( font ); painter.setPen( color ); painter.drawText( start_point, text ); painter.restore(); }; auto DrawRowCenter2 = [ &painter, &free_rect ]( QFont font, QColor color, QString text, QColor color2, QString text2, double spase = 1 ) { painter.save(); QFontMetrics metrix( font ); QRect place; AllocatePlace( place, metrix.height()*spase ,free_rect ); QPoint start_point( place.center().x() - metrix.width( text + text2 ) / 2, place.center().y() +metrix.height()/2); painter.setFont( font ); painter.setPen( color ); painter.drawText( start_point, text ); QPoint start_point2( place.center().x() - metrix.width( text + text2 ) / 2 + metrix.width( text ) , place.center().y() +metrix.height()/2); painter.setPen( color2 ); painter.drawText( start_point2, text2 ); painter.restore(); }; auto DrawRowLeft = [ &painter, &free_rect ]( QFont font, QColor color1, QColor color2, QString label, QString value, QString value2 = "", double spase = 1 ) { painter.save(); QFontMetrics metrix( font ); QRect place; AllocatePlace( place, metrix.height()*spase, free_rect ); QPoint start_point( place.left() , place.center().y()+metrix.height()/2 ); QPoint start_point2( place.left() + metrix.width(label), place.center().y() +metrix.height()/2); QPoint start_point3( place.left() + metrix.width(label + value), place.center().y() +metrix.height()/2); painter.setFont( font ); painter.setPen( color1 ); painter.drawText( start_point, label ); painter.setPen( color2 ); painter.drawText( start_point2, value ); painter.setPen( Qt::gray ); painter.drawText( start_point3, value2 ); painter.restore(); }; auto DrawLastRow = [ &painter, &free_rect ]( QFont font, QColor color, QString text, double spase = 1 ) { painter.save(); QFontMetrics metrix( font ); QRect place; QRect draw_place; while ( AllocatePlace( place, metrix.height()*spase ,free_rect ) ) { draw_place = place; } QPoint start_point( place.left() , place.center().y()+metrix.height()/2 ); painter.setFont( font ); painter.setPen( color ); painter.drawText( start_point, text ); painter.restore(); }; QFontMetrics m(text_font); int width = m.width("12345678901234567890123456789012345678901234567890"); char symbol = '.'; auto FillToSize = [ width, &m, symbol ]( QString text ) { while( m.width( text + symbol ) < width ) text += symbol; return text + " "; }; double row_skale = 2; DrawRowCenter2( title_font, Qt::black, "ОТЧЕТ", Qt::red, " ( " + mReportType + " ) ", row_skale); DrawRowCenter( level_font, Qt::black, "Испытания дискретного аппарата", row_skale ); DrawRowCenter( level_font, Qt::red, mGsType, row_skale ); DrawRowLeft( text_font, Qt::black, Qt::red, "Идентификационный номер: ", mSerNo, "", row_skale); test::hydro::Parameters old; QJsonObject f = test::ReadFromFile( compare_width ).value("Params").toObject(); old.Deserialize( f ); QString str_e_wp = !compare_width.isEmpty() ? " (" +test::ToString(old.MaxWorkPressure()) + ")" : QString(); QString str_e_exp = !compare_width.isEmpty() ? " (" +test::ToString(old.MaxExpenditure()) + ")" : QString(); QString str_e_mxcp = !compare_width.isEmpty() ? ( old.ControlType() != CT_ELECTRIC ? " (" +test::ToString(old.MaxControlPressure()) + ")" : "( - )" ) : QString(); QString str_e_mncp = !compare_width.isEmpty() ? ( old.ControlType() != CT_ELECTRIC ? " (" +test::ToString(old.MinControlPressure()) + ")" : "( - )" ) : QString(); QString str_e_vt = !compare_width.isEmpty() ? " (" +test::ToString(old.Voltage()) + ")" : QString(); DrawRowLeft( text_font, Qt::black, Qt::red, FillToSize("Максимальное давление, бар"), test::ToString( mMaxWorkPressure ),str_e_wp, row_skale ); DrawRowLeft( text_font, Qt::black, Qt::red, FillToSize("Максимальный расход, л/мин"), test::ToString( mMaxExpenditure ), str_e_exp,row_skale ); if ( mControlType == CT_ELECTRIC ) { DrawRowLeft( text_font, Qt::black, Qt::red, FillToSize("Максимальное давление управления*, бар"), "-", str_e_mxcp, row_skale ); DrawRowLeft( text_font, Qt::black, Qt::red, FillToSize("Минимальное давление управления*, бар"), "-", str_e_mncp, row_skale ); } else { DrawRowLeft( text_font, Qt::black, Qt::red, FillToSize("Максимальное давление управления*, бар"), test::ToString(mMaxControlPressure), str_e_mxcp, row_skale ); DrawRowLeft( text_font, Qt::black, Qt::red, FillToSize("Минимальное давление управления*, бар"), test::ToString(mMinControlPressure), str_e_mncp, row_skale ); } DrawRowLeft( text_font, Qt::black, Qt::red, FillToSize("Напряжение пинания, В"), "="+test::ToString( mVoltage )+" (~220)",str_e_vt, row_skale ); DrawRowLeft( text_font, Qt::black, Qt::black, FillToSize("Тонкость фильтрации рабочей жидкости, мкм"), "________", "", row_skale ); DrawRowLeft( text_font, Qt::black, Qt::black, FillToSize("Тип масла"), "Лукой Гейзер HLP32", "", row_skale ); DrawRowLeft( text_font, Qt::black, Qt::black, FillToSize("Вязкость масла (при 40˚С), сСт"), test::ToString(32), "", row_skale ); if ( !compare_width.isEmpty() ) { DrawRowLeft( text_font, Qt::black, Qt::red, "Аппарат для сравнения характеристик: ", "", "", row_skale ); DrawRowLeft( text_font, Qt::black, Qt::red, "", old.SerNo(), "", row_skale ); DrawRowLeft( text_font, Qt::black, Qt::red, FillToSize("Дата испытания сравниваемого аппарата"), old.Date().toString("dd MMMM yyyy г. hh:mm"), "", row_skale ); DrawRowLeft( text_font, Qt::black, Qt::red, FillToSize("Сравнение с эталоном"), old.ReportType().compare("Эталон", Qt::CaseInsensitive) == 0? "Да": "Нет", "", row_skale ); } else { DrawRowLeft( text_font, Qt::black, Qt::red, "Аппарат для сравнения характеристик: ", "-", "", row_skale ); DrawRowLeft( text_font, Qt::black, Qt::red, FillToSize("Дата испытания сравниваемого аппарата"), "-", "", row_skale ); DrawRowLeft( text_font, Qt::black, Qt::red, FillToSize("Сравнение с эталоном"), "-", "", row_skale ); } DrawRowLeft( text_font, Qt::black, Qt::red, FillToSize("Класс чистоты жидкости (по ISO 4406)"), "________", "", row_skale ); DrawRowCenter( text_font, Qt::black, "", row_skale ); DrawRowLeft( text_font, Qt::black, Qt::red, "Испытания проводил: ", mUser, "", row_skale ); DrawRowLeft( text_font, Qt::black, Qt::red, "Дата проведения испытаний: ", mDate.toString("dd MMMM yyyy г. hh:mm"), "", row_skale ); DrawLastRow( text_font, Qt::black, "*Для распределителей с электрогидравлическим управлением"); return true; }
bool FunctionalTest::Draw(QPainter& painter, QRect &free_rect , const QString &) const { test::hydro_cylinder::Parameters *params = static_cast< test::hydro_cylinder::Parameters * >( CURRENT_PARAMS ); if ( !params ) return true; QFont header_font = painter.font(); header_font.setFamily("Arial"); header_font.setPointSize( 14 ); QFont result_font = header_font; result_font.setUnderline(true); QFont text_font = header_font; text_font.setPointSize( 12 ); auto DrawRowCenter = [ &painter, &free_rect ](QRect const& place, QFont const& font, QColor const& color, QString const& text ) { painter.save(); QFontMetrics metrix( font ); QPoint start_point( place.center().x() - metrix.width( text ) / 2, place.center().y() +metrix.height()/2); painter.setFont( font ); painter.setPen( color ); painter.drawText( start_point, text ); painter.restore(); }; auto DrawRowLeft = [ &painter, &free_rect ]( QRect const& place, QFont const& font, QColor const& color1, QString const& label, QColor const& color2 = Qt::black, QString const& value = "", QColor const& color3 = Qt::black, QString const& value2 = "") { painter.save(); QFontMetrics metrix( font ); QPoint start_point( place.left() , place.center().y()+metrix.height()/2 ); QPoint start_point2( start_point.x() + metrix.width(label), place.center().y() +metrix.height()/2); QPoint start_point3( start_point2.x() + metrix.width(value), place.center().y() +metrix.height()/2); painter.setFont( font ); painter.setPen( color1 ); painter.drawText( start_point, label ); painter.setPen( color2 ); painter.drawText( start_point2, value ); painter.setPen( color3 ); painter.drawText( start_point3, value2 ); painter.restore(); }; QFontMetrics m(text_font); int width = m.width("123456789012345678901234567890123456789012345"); char symbol = '.'; auto FillToSize = [ width, &m, symbol ]( QString text ) { while( m.width( text + symbol ) < width ) text += symbol; return text + " "; }; uint32_t num = 0; bool res = DrawLine( num, free_rect, result_font, [ this, &painter, &DrawRowCenter, &result_font ]( QRect const& rect ) { DrawRowCenter( rect, result_font, Qt::black, "Результаты испытаний" ); }, 2 ); res = DrawLine( num, free_rect, text_font, [ this, &painter, &DrawRowLeft, &FillToSize, &text_font ]( QRect const& rect ) { DrawRowLeft( rect, text_font, Qt::black, FillToSize("Температура масла во время испытаний, ˚С"), Qt::red, test::ToString(OilTemp) ); }, 2 ); QString header = "<html>" "<head>" "<meta charset='utf-8'>" "<style type='text/css'>" "td { text-align: center;}" "th { font-weight: normal; padding: 2px;}" "table {border-collapse: collapse; border-style: solid; vertical-align:middle;}" "</style>" "</head>" "<body>" "<table width='100%' border='1.5' cellspacing='-0.5' cellpadding='-0.5'>" "<tr>" "<th> Номер </th>" "<th></th>" "<th> Работоспособность </th>" "</tr>"; QString footer = "</table>" "</body>" "</html>"; typedef std::pair<QString, bool> Item; std::vector< Item > tests; tests.push_back( Item( "Наружная герметичность ", HermResult ) ); tests.push_back( Item( "Максимальное давление", MaxPressureResult ) ); tests.push_back( Item( "Рабочее давление", WorkPressureResult ) ); tests.push_back( Item( "Номинальный расход", ExpenditureResult ) ); tests.push_back( Item( "Время перемещения в одну сторону", MoveTimeResult ) ); QString rows; for ( size_t i = 1, end = tests.size(); i <= end; ++i ) { Item& data = tests[i-1]; rows += "<tr>" "<td>"+test::ToString( static_cast<int>(i) )+"</td>" "<td>"+ data.first +"</td>" "<td style='font-size:28pt; color: \"red\"; font-weight:bold;'>"+ (data.second ? QString("+"):QString("-")) +"</td>" "</tr>"; } QString table = header + rows + footer; QTextDocument doc; doc.setUndoRedoEnabled( false ); doc.setTextWidth( free_rect.width() ); doc.setUseDesignMetrics( true ); doc.setDefaultTextOption ( QTextOption (Qt::AlignHCenter ) ); doc.setHtml( table ); auto h = doc.documentLayout()->documentSize().height(); res = DrawLine( num, free_rect, text_font, [ this, &painter, &doc, &text_font ]( QRect const& rect ) { painter.save(); QRectF r( 0, 0, rect.width(), rect.height() ); painter.translate( rect.topLeft() ); doc.drawContents( &painter, r); painter.restore(); }, 1, h ); res = DrawLine( num, free_rect, header_font, [ this, &painter, &DrawRowLeft, &header_font ]( QRect const& rect ) { DrawRowLeft( rect, header_font, Qt::black, "ИТОГ:" ); }, 1.5 ); res = DrawLine( num, free_rect, text_font, [ this, &painter, &DrawRowLeft, &text_font, params ]( QRect const& rect ) { DrawRowLeft( rect, text_font, Qt::black, "Гидроцилиндр ", Qt::red, params->SerNo() + (Success()? QString(" годен ") : QString(" не годен ")), Qt::black, " к эксплуатации"); }, 3 ); return res; }