void QuMCQGridDouble::addOptions(QGridLayout* grid, int row) { for (bool first_field : {true, false}) { const NameValueOptions& opts = first_field ? m_options1 : m_options2; for (int i = 0; i < opts.size(); ++i) { McqFunc::addOption(grid, row, colnum(first_field, i), opts.at(i).name()); } } }
void multmat(mat x,mat y,mat &z) { createmat(x); colnum(x); createmat(y); colnum(y); z.mu=x.mu;z.nu=y.nu;z.tu=0; int arow=0,brow=0,crow=0,ccol=0,tp=0,t=0,q=0,p=0; int h=0; int ctemp[500]={0}; if(x.tu*y.tu!=0) { for(arow=1;arow<=x.mu;++arow) { for(h=0;h<=22;h++)ctemp[h]=0;//当前行各元素累加器清零 z.rpos[arow]=z.tu+1; if(arow<x.mu)tp=x.rpos[arow+1]; else{tp=x.tu+1;} for(p=x.rpos[arow];p<tp;++p) { brow=x.data[p].j; if(brow<y.mu)t=y.rpos[brow+1]; else t=y.tu+1; for(q=y.rpos[brow];q<t;++q) { ccol=y.data[q].j; ctemp[ccol]+=x.data[p].e*y.data[q].e; }//for q }//求得z中第crow(=arow)行的非零元 for(ccol=1;ccol<=z.nu;++ccol) if(ctemp[ccol]) { if(++z.tu>maxsize)printf("抱歉,矩阵的乘积越界"); z.data[z.tu].i=arow; z.data[z.tu].j=ccol; z.data[z.tu].e=ctemp[ccol]; }//if }//for arow }//if printf("现在我们得到了结果(阵列形式):\n"); printmat(z); }
QPointer<QWidget> QuMCQGridDouble::makeWidget(Questionnaire* questionnaire) { bool read_only = questionnaire->readOnly(); m_widgets1.clear(); m_widgets2.clear(); // As per QuMCQGrid QGridLayout* grid = new QGridLayout(); grid->setHorizontalSpacing(UiConst::MCQGRID_HSPACING); grid->setVerticalSpacing(UiConst::MCQGRID_VSPACING); int n_subtitles = m_subtitles.size(); int n_rows = 1 + n_subtitles + m_questions_with_fields.size(); int n_cols = m_options1.size() + m_options2.size() + 3; Qt::Alignment response_align = McqFunc::response_widget_align; int row = 0; // First column: titles, subtitles, questions // Then vertical break // Then m_options1 // Then vertical break // Then m_options2 // I note in passing: // http://stackoverflow.com/questions/25101085/style-sheet-is-appliped-to-the-cells-in-qgridlayout-instead-of-the-parent-contai // Title row McqFunc::addOptionBackground(grid, row, 0, n_cols); McqFunc::addTitle(grid, row, m_title); addOptions(grid, row); ++row; // new row after title/option text // Main question rows (with any preceding subtitles) for (int qi = 0; qi < m_questions_with_fields.size(); ++qi) { // Any preceding subtitles? for (int s = 0; s < n_subtitles; ++s) { const McqGridSubtitle& sub = m_subtitles.at(s); if (sub.pos() == qi) { // Yes. Add a subtitle row. McqFunc::addOptionBackground(grid, row, 0, n_cols); McqFunc::addSubtitle(grid, row, sub.string()); if (sub.repeatOptions()) { addOptions(grid, row); } ++row; // new row after subtitle } } // The question McqFunc::addQuestion(grid, row, m_questions_with_fields.at(qi).question()); // The response widgets for (bool first : {true, false}) { const NameValueOptions& opts = first ? m_options1 : m_options2; int n_options = opts.size(); QList<QList<QPointer<BooleanWidget>>>& widgets = first ? m_widgets1 : m_widgets2; QList<QPointer<BooleanWidget>> question_widgets; for (int vi = 0; vi < n_options; ++vi) { QPointer<BooleanWidget> w = new BooleanWidget(); w->setAppearance(BooleanWidget::Appearance::Radio); w->setReadOnly(read_only); if (!read_only) { connect(w, &BooleanWidget::clicked, std::bind(&QuMCQGridDouble::clicked, this, qi, first, vi)); } grid->addWidget(w, row, colnum(first, vi), response_align); question_widgets.append(w); } widgets.append(question_widgets); } ++row; // new row after question/response widgets } // Set widths, if asked if (m_question_width > 0 && m_option1_widths.size() == m_options1.size() && m_option2_widths.size() == m_options2.size()) { grid->setColumnStretch(0, m_question_width); for (bool first : {true, false}) { QList<int>& widths = first ? m_option1_widths : m_option2_widths; for (int i = 0; i < widths.size(); ++i) { grid->setColumnStretch(colnum(first, i), widths.at(i)); } } } // Vertical lines McqFunc::addVerticalLine(grid, spacercol(true), n_rows); McqFunc::addVerticalLine(grid, spacercol(false), n_rows); QPointer<QWidget> widget = new QWidget(); widget->setLayout(grid); widget->setObjectName("mcq_grid_double"); if (m_expand) { widget->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Maximum); } else { widget->setSizePolicy(QSizePolicy::Maximum, QSizePolicy::Maximum); } setFromFields(); return widget; }