• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            隨筆 - 70, 文章 - 0, 評論 - 9, 引用 - 0
            數(shù)據(jù)加載中……

            QDateEdit的dataChanged信號槽執(zhí)行2次問題

            要實(shí)現(xiàn)修改日期,當(dāng)不是指定條件時(shí)(今天),報(bào)錯(cuò),并將其值設(shè)置有效(今天),代碼如下

            connect(ui->dateEdit, SIGNAL(dateChanged(QDate)), this, SLOT(date1(QDate)));

            void TestUI::date1(const QDate & date)
            {
                
            if (date != QDate::currentDate())
                
            {
                    ui
            ->dateEdit->blockSignals(true);
                    QMessageBox::warning(
            this"a", QString::number(b));
                    ui
            ->dateEdit->setDate(QDate::currentDate());
                    ui
            ->dateEdit->blockSignals(false);
                }

            }


            結(jié)果:當(dāng)不滿足條件時(shí),彈出框彈了2次。

            跟蹤代碼:

            void QAbstractSpinBoxPrivate::setValue(const QVariant &val, EmitPolicy ep,
                                                   
            bool doUpdate)
            {
                Q_Q(QAbstractSpinBox);
                
            const QVariant old = value;
                value 
            = bound(val);
                pendingEmit 
            = false;
                cleared 
            = false;
                
            if (doUpdate) {
                    updateEdit();
                }

                q
            ->update();

                
            if (ep == AlwaysEmit || (ep == EmitIfChanged && old != value)) {
                    emitSignals(ep, old);
                }

            }

            在updateEdit();(設(shè)置新值)之后又執(zhí)行了emitSignals(ep, old); 這里再次發(fā)送了信號
            void QDateTimeEditPrivate::emitSignals(EmitPolicy ep, const QVariant &old)
            {
                Q_Q(QDateTimeEdit);
                
            if (ep == NeverEmit) {
                    
            return;
                }

                pendingEmit 
            = false;

                
            const bool dodate = value.toDate().isValid() && (sections & DateSectionMask);
                
            const bool datechanged = (ep == AlwaysEmit || old.toDate() != value.toDate());
                
            const bool dotime = value.toTime().isValid() && (sections & TimeSectionMask);
                
            const bool timechanged = (ep == AlwaysEmit || old.toTime() != value.toTime());

                updateCache(value, displayText());

                syncCalendarWidget();
                
            if (datechanged || timechanged)
                    emit q
            ->dateTimeChanged(value.toDateTime());
                
            if (dodate && datechanged)
                    emit q
            ->dateChanged(value.toDate());
                
            if (dotime && timechanged)
                    emit q
            ->timeChanged(value.toTime());

            }

            很可能是這里讓其再執(zhí)行槽函數(shù)。
            官方也給出了這個(gè)bug:http://bugreports.qt.nokia.com/browse/QTBUG-10220
            解決辦法
            1  修改QDateTimeEditPrivate::emitSignals,使其不發(fā)送信號。(未做測試)
            2  修改我的代碼,加個(gè)變量判斷其狀態(tài),只有在第一次執(zhí)行槽函數(shù)時(shí)做彈出框,代碼如下:
            void TestUI::date1(const QDate & date)
            {
                ui
            ->dateEdit->blockSignals(true);
                
            if (b)
                
            {
                    QMessageBox::warning(
            this"a", QString::number(b));
                    ui
            ->dateEdit->setDate(QDate::currentDate());
                    b 
            = false;
                }

                
            else
                
            {
                    ui
            ->dateEdit->setDate(QDate::currentDate());
                    b 
            = true;
                }

                ui
            ->dateEdit->blockSignals(false);
            }

            注意:2個(gè)分支里都要重新設(shè)置日期!

            posted on 2011-04-13 17:16 seahouse 閱讀(3408) 評論(0)  編輯 收藏 引用 所屬分類: Qt

            欧美精品久久久久久久自慰| 国产精品久久久久久影院| 国产精品禁18久久久夂久| 久久亚洲av无码精品浪潮| 91久久精品国产91性色也| 亚洲av日韩精品久久久久久a| 精品伊人久久久| 精品久久久久成人码免费动漫 | 一本色道久久综合狠狠躁篇| 99久久精品免费看国产免费| 精品久久一区二区| 日本三级久久网| 国产精品无码久久久久| 狠狠人妻久久久久久综合| 国产成人综合久久久久久| 久久男人AV资源网站| 一本久久综合亚洲鲁鲁五月天亚洲欧美一区二区 | 九九久久自然熟的香蕉图片| 久久亚洲国产成人精品性色| 99久久人妻无码精品系列蜜桃| 国产精品9999久久久久| 国产2021久久精品| 欧美色综合久久久久久| 久久人人爽人人爽人人片av麻烦| 国产亚洲美女精品久久久2020| 久久亚洲精品成人av无码网站| 青青青伊人色综合久久| 久久午夜综合久久| 久久精品亚洲一区二区三区浴池 | 国产精品18久久久久久vr | 久久精品免费大片国产大片| 午夜视频久久久久一区| 久久精品毛片免费观看| 久久久精品久久久久久 | 久久国产视屏| 看久久久久久a级毛片| 久久WWW免费人成—看片| 久久人人爽人人爽人人片AV不| 久久久精品日本一区二区三区| 久久精品国产亚洲AV无码娇色 | 精品久久久久久中文字幕大豆网|