コード例 #1
0
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());
        }
    }
}
コード例 #2
0
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);
}
コード例 #3
0
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;
}