#include "dialogselectsegment2.h" #include "SNCDataBase.h" #include "ui_dialogselectsegment2.h" #include "numberreg.h" #include "segmentupdate.h" DialogSelectSegment2::DialogSelectSegment2(QWidget *parent) : QDialog(parent), ui(new Ui::DialogSelectSegment2) { ui->setupUi(this); connect(ui->tableWidget->verticalScrollBar(),SIGNAL(valueChanged(int)),this,SLOT(onSlideValueChanged(int))); ui->startEdit->setValidator(new QRegExpValidator(NumberReg::getSegmentReg(), this)); ui->endEdit->setValidator(new QRegExpValidator(NumberReg::getSegmentReg(), this)); connect(ui->tableWidget->horizontalHeader(), SIGNAL(sectionClicked(int)),this, SLOT(sortByColumnOffset(int))); ui->widget->setVisible(true); ui->endEdit->setVisible(false); ui->selfRB->setVisible(false); ui->pushButtonPosition->setEnabled(false); ui->startEdit->setText(""); this->bAppend = false; loadCity(); setDefaultSegState(); movie = new QMovie(":/fetchfromserver.gif"); movie->start(); ui->tableWidget->installEventFilter(this); ui->labelCount->setText("共" + QString::number(SNCDataBase::getSegCount()) + "个号段"); } void DialogSelectSegment2::showFetchAnimation() { initTable(13); //ui->tableWidget->verticalHeader()->setVisible(false); ui->tableWidget->setAlternatingRowColors(true); QLabel *lbl = new QLabel(); lbl->setMovie(movie); //ui->tableWidget->setEnabled(false); ui->tableWidget->setCellWidget(6,12,lbl); QTableWidgetItem *item = new QTableWidgetItem(" 正在读取..."); item->setTextAlignment(Qt::AlignHCenter|Qt::AlignVCenter); ui->tableWidget->setItem(6,12,item); //ui->tableWidget->resizeColumnsToContents(); //ui->tableWidget->resizeRowsToContents(); } void DialogSelectSegment2::setDefaultSegState() { initTable(13); } void DialogSelectSegment2::saveToFile() { QString path = QDir::tempPath() + QString("/SNCTempFile/"); QDir dir(path); if(!dir.exists()) { dir.mkpath(path); } QList segs = getSelectedSegmentsInfo(); QString fileName = QString("号码推荐_%1_%2_(共%3个号段).txt").arg(currentProvince).\ arg(currentCity).\ arg(segs.size()); m_filename.clear(); QString fullPath = path + fileName; m_filename.insert("fullpath",fullPath); m_filename.insert("filename",fileName); QFile file(fullPath); if(!file.open(QIODevice::WriteOnly)) return ; QTextStream out(&file); for(int i=0;itreeView->setEnabled(true); fetchSegmentData(); } void DialogSelectSegment2::renderViewPort(int value) { for(int j = qMax(0,value - 1);j < qMin(value + 20,ui->tableWidget->rowCount());j++) { if(!ui->tableWidget->cellWidget(j,12)) { QTableWidgetItem *itemSample = this->ui->tableWidget->item(j,5); QTableWidgetItem *itemNumber = this->ui->tableWidget->item(j,6); double sampleIndex = qMin(itemSample->data(Qt::UserRole).toInt(),100); double numberIndex = qMin(itemNumber->data(Qt::UserRole).toInt(),100); QLabel *labelSample = createSampleLabel(sampleIndex); QLabel *labelNumber = createNumberLabel(numberIndex); ui->tableWidget->setCellWidget(j,12,labelSample); ui->tableWidget->setCellWidget(j,13,labelNumber); } } } DialogSelectSegment2::~DialogSelectSegment2() { delete segmentModel; delete ui; } void DialogSelectSegment2::loadCity() { segmentModel = new QStandardItemModel(); segmentModel->setHorizontalHeaderItem(0,new QStandardItem("号码地区")); QString current; QStandardItem *parentItem = new QStandardItem(); QList maps= SNCDataBase::getRegionInfo(); if(maps.size()!=2) return ; ui->treeView->header()->setStyleSheet("font:12px"); for(int i=0;iappendRow(provinceItem); parentItem->appendRow(cityItem); } else { cityItem= new QStandardItem(city); parentItem->appendRow(cityItem); } } ui->treeView->setModel(segmentModel); } void DialogSelectSegment2::on_treeView_clicked(const QModelIndex &index) { if(index.parent().isValid()) { this->currentProvince = index.parent().data().toString(); this->currentCity = index.data().toString(); /**/// QString areacode = SNCDataBase::getAreaCodeByCityName(this->currentCity); QString checkdate = SNCDataBase::getCitySegLastCheckDate(areacode); QString today = QDate::currentDate().toString("yyyy-MM-dd"); showFetchAnimation(); SegmentUpdate *update = new SegmentUpdate(); if(checkdate!=today) update->setMethod(UpdateDynamicInfo); update->setPara("areacode",areacode); connect(update,SIGNAL(updateFinished()),this,SLOT(onSegmentUpdateFinished())); connect(update,SIGNAL(updateProgress(QString,int)),this,SLOT(onUpdateMessage(QString,int))); ui->treeView->setEnabled(false); update->start(); } } void DialogSelectSegment2::fetchSegmentData() { QStringList list; if(this->currentCity.isEmpty()) return ; if(ui->allRB->isChecked()) list = SNCDataBase::getSegmentDynamicByCityAll(this->currentCity); if(ui->cmccRB->isChecked()) list = SNCDataBase::getSegmentDynamicByCityAndCorp(this->currentCity,"CMCC"); if(ui->cutcRB->isChecked()) list = SNCDataBase::getSegmentDynamicByCityAndCorp(this->currentCity,"CUTC"); if(ui->ctccRB->isChecked()) list = SNCDataBase::getSegmentDynamicByCityAndCorp(this->currentCity,"CTCC"); if(ui->selfRB->isChecked()) list = SNCDataBase::getSegmentDynamicByCityAndRange(this->currentCity,this->ui->startEdit->text(),this->ui->endEdit->text()); initTable(list.size()); for(int i=0;isetTextAlignment(Qt::AlignHCenter|Qt::AlignVCenter); item->setData(Qt::DisplayRole,records.at(j).toInt()); item->setData(Qt::UserRole,records.at(j)); if(j==1 || j==2 || j==3 || j==4 || j==7) { QTableWidgetItem *itemDisplay; itemDisplay = new QTableWidgetItem(); itemDisplay->setTextAlignment(Qt::AlignHCenter|Qt::AlignVCenter); if( j ==1 || j==2 || j==3 || j==4 ) itemDisplay->setData(Qt::DisplayRole,records.at(j)+"%"); else { int day = records.at(j).toInt(); if(day<0) itemDisplay->setData(Qt::DisplayRole,"N/A"); else if(day==0) itemDisplay->setData(Qt::DisplayRole,"最新"); else if(day<7) itemDisplay->setData(Qt::DisplayRole,QString::number(day)+"天前"); else if(day>=7 && day <=31) itemDisplay->setData(Qt::DisplayRole,QString::number(day/7)+"周前"); else itemDisplay->setData(Qt::DisplayRole,"1个月前"); } this->ui->tableWidget->setItem(i,j+7,itemDisplay); } this->ui->tableWidget->setItem(i,j,item); } } this->ui->tableWidget->sortByColumn(6); this->ui->tableWidget->sortByColumn(6); renderViewPort(ui->tableWidget->verticalScrollBar()->value()); ui->lblCount->setText(QString("您已选择%1个号段").arg(0)); for(int i=0;itableWidget->rowCount();i++) { QTableWidgetItem *item = ui->tableWidget->item(i,0); //qDebug()<data(Qt::DisplayRole)<startEdit->text(); if(item->data(Qt::DisplayRole).toString()==ui->startEdit->text()) { //ui->tableWidget->setAutoScroll(true); //QModelIndex index = ui->tableWidget->model()->index ui->tableWidget->setCurrentItem(item); ui->tableWidget->verticalScrollBar()->setValue(i); ui->tableWidget->viewport()->setFocus(); ui->lblCount->setText(QString("您已选择%1个号段").arg(1)); break; } } } void DialogSelectSegment2::on_allRB_clicked() { //ui->widget->setVisible(false); fetchSegmentData(); } void DialogSelectSegment2::on_cmccRB_clicked() { //ui->widget->setVisible(false); fetchSegmentData(); } void DialogSelectSegment2::on_cutcRB_clicked() { //ui->widget->setVisible(false); fetchSegmentData(); } void DialogSelectSegment2::on_ctccRB_clicked() { //ui->widget->setVisible(false); fetchSegmentData(); } void DialogSelectSegment2::on_selfRB_clicked() { //ui->widget->setVisible(true); if(ui->startEdit->hasAcceptableInput()&&ui->endEdit->hasAcceptableInput()&&ui->selfRB->isChecked()) fetchSegmentData(); } void DialogSelectSegment2::on_startEdit_textChanged(const QString &arg1) { //if(ui->startEdit->hasAcceptableInput()&&ui->endEdit->hasAcceptableInput()&&ui->selfRB->isChecked()) // fetchSegmentData(); if(ui->startEdit->hasAcceptableInput()){ QStringList list = SNCDataBase::getCityBySegment(ui->startEdit->text()); if(list.size()==3) ui->pushButtonPosition->setEnabled(true); else ui->pushButtonPosition->setEnabled(false); } else ui->pushButtonPosition->setEnabled(false); } void DialogSelectSegment2::on_endEdit_textChanged(const QString &arg1) { if(ui->startEdit->hasAcceptableInput()&&ui->endEdit->hasAcceptableInput()&&ui->selfRB->isChecked()) fetchSegmentData(); } QList DialogSelectSegment2::getSelectedSegmentsInfo() { QList segments; if(this->currentCity.isEmpty()) return segments; for(int i=0;iui->tableWidget->rowCount();i++) { QStringList infos; for(int j=0;j<=7;j++) { QTableWidgetItem *item; item = this->ui->tableWidget->item(i,j); if(0 == j) { if(!item->isSelected()) break; else infos.append(this->currentCity); } infos.append(item->data(Qt::UserRole).toString()); } if(infos.size()>0) segments.append(infos); } return segments; } QMap DialogSelectSegment2::getSaveFileName() { return m_filename; } QLabel* DialogSelectSegment2::createSampleLabel(double sampleIndex) { QLabel *label = new QLabel(); /*label->setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed); label->setMaximumWidth(200); label->setMinimumWidth(200); label->setMaximumHeight(10); label->setMinimumHeight(10); */ if(sampleIndex<20) label->setPixmap(QPixmap(":/red-bar.png")); else if(sampleIndex>=20 && sampleIndex<50) label->setPixmap(QPixmap(":/yellow-bar.png")); else label->setPixmap(QPixmap(":/blue-bar.png")); /* if(sampleIndex<20) label->setStyleSheet("QLabel{background-image: url(:/red-bar.png);background-repeat:norepeat; width:12px; background-color: rgb(255, 170, 255); }"); else if(sampleIndex>=20 && sampleIndex<50) label->setStyleSheet("QLabel{background-image: url(:/yellow-bar.png); background-color: rgb(255, 170, 255); }"); else label->setStyleSheet("QLabel{background-image: url(:/blue-bar.png); background-color: rgb(255, 170, 255); }"); */ label->setSizePolicy(QSizePolicy::Fixed,QSizePolicy::Preferred); label->setMinimumWidth(sampleIndex); label->setMaximumWidth(sampleIndex); return label; } QLabel* DialogSelectSegment2::createNumberLabel(double numberIndex) { QLabel *label = new QLabel(); if(numberIndex==0) label->setPixmap(QPixmap(":/s0.png")); else if(numberIndex>0 && numberIndex<20) label->setPixmap(QPixmap(":/s1.png")); else if(numberIndex>=20 && numberIndex<40) label->setPixmap(QPixmap(":/s2.png")); else if(numberIndex>=40 && numberIndex<60) label->setPixmap(QPixmap(":/s3.png")); else if(numberIndex>=60 && numberIndex<80) label->setPixmap(QPixmap(":/s4.png")); else label->setPixmap(QPixmap(":/s5.png")); return label; } void DialogSelectSegment2::sortByColumnOffset(int col) { if(col == 8) col = 1; else if(col == 9) col = 2; else if(col == 10) col = 3; else if(col == 11) col = 4; else if(col == 12) col = 5; else if(col == 13) col = 6; else if(col == 14) col = 7; if(!ui->tableWidget->item(0,0)) return ; this->ui->tableWidget->sortByColumn(col); renderViewPort(ui->tableWidget->verticalScrollBar()->value()); } void DialogSelectSegment2::initTable(int rows) { ui->tableWidget->horizontalHeader()->setVisible(true); ui->tableWidget->verticalHeader()->setVisible(true); ui->tableWidget->horizontalHeader()->setStyleSheet("font:12px"); QStringList headers; headers.append("号段"); headers.append("实号"); headers.append("空号"); headers.append("停机"); headers.append("关机"); headers.append("样本数量"); headers.append("推荐度"); headers.append("更新时间"); headers.append("实号"); headers.append("空号"); headers.append("停机"); headers.append("关机"); headers.append("样本数量"); headers.append("推荐度"); headers.append("更新时间"); for(int j=0;jtableWidget->rowCount();j++) { if( ui->tableWidget->cellWidget(j,12)) { delete ui->tableWidget->cellWidget(j,12); } if( ui->tableWidget->cellWidget(j,13)) { delete ui->tableWidget->cellWidget(j,13); } } this->ui->tableWidget->setRowCount(0); this->ui->tableWidget->setColumnCount(0); this->ui->tableWidget->setSelectionBehavior(QAbstractItemView::SelectRows); this->ui->tableWidget->setSelectionMode(QAbstractItemView::MultiSelection); this->ui->tableWidget->setEditTriggers(QAbstractItemView::NoEditTriggers); this->ui->tableWidget->setColumnCount(15); this->ui->tableWidget->setHorizontalHeaderLabels(headers); this->ui->tableWidget->setShowGrid(false); this->ui->tableWidget->setAlternatingRowColors(true); this->ui->tableWidget->setColumnWidth(0,90); this->ui->tableWidget->setColumnWidth(8,40); this->ui->tableWidget->setColumnWidth(9,40); this->ui->tableWidget->setColumnWidth(10,40); this->ui->tableWidget->setColumnWidth(11,40); this->ui->tableWidget->setColumnWidth(12,120); this->ui->tableWidget->setColumnWidth(13,120); this->ui->tableWidget->setColumnWidth(14,90); this->ui->tableWidget->hideColumn(1); this->ui->tableWidget->hideColumn(2); this->ui->tableWidget->hideColumn(3); this->ui->tableWidget->hideColumn(4); this->ui->tableWidget->hideColumn(5); this->ui->tableWidget->hideColumn(6); this->ui->tableWidget->hideColumn(7);/**/ this->ui->tableWidget->setRowCount(rows); ui->tableWidget->verticalHeader()->setVisible(false); ui->tableWidget->horizontalHeader()->setResizeMode(QHeaderView::Fixed); ui->tableWidget->verticalHeader()->setResizeMode(QHeaderView::Fixed); ui->tableWidget->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOn); ui->tableWidget->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff); ui->tableWidget->verticalHeader()->setFixedWidth(40); ui->tableWidget->verticalHeader()->setDefaultSectionSize(30); ui->tableWidget->horizontalHeader()->setFixedHeight(30); ui->tableWidget->setSortingEnabled(true); } bool DialogSelectSegment2::isAppend() { return bAppend; } void DialogSelectSegment2::on_pushButtonAppend_clicked() { bAppend = true; saveToFile(); this->accept(); } void DialogSelectSegment2::on_tableWidget_itemSelectionChanged() { QList items = ui->tableWidget->selectedItems(); if(items.size()==0) return ; int count=0; for(int i=0;icolumn()==0) { count++; } } ui->lblCount->setText(QString("您已选择%1个号段").arg(count)); } void DialogSelectSegment2::on_pushButtonClose_clicked() { this->reject(); } void DialogSelectSegment2::onUpdateMessage(QString msg, int rtCode) { if(rtCode==-3) QMessageBox::critical(this,"系统通知",msg,QMessageBox::Ok); } void DialogSelectSegment2::on_pushButtonClear_clicked() { for(int i=0;itableWidget->rowCount();i++) { QTableWidgetItem *item; item = this->ui->tableWidget->item(i,0); if(item->isSelected()) this->ui->tableWidget->selectRow(i); } ui->lblCount->setText(QString("您已选择%1个号段").arg(0)); } bool DialogSelectSegment2::eventFilter(QObject *object, QEvent *event) { if( event->type() == QEvent::KeyPress) { // if yes, we need to cast the event into a QMouseEvent type QKeyEvent * pKeyEvent = static_cast(event); // check whether it's mid button pressed if (pKeyEvent->key() == Qt::Key_Control||pKeyEvent->key() == Qt::Key_Shift) { //do the processing and return true //textBrowserErrorInfo->setText(tr("clicked")); ui->tableWidget->setSelectionMode(QAbstractItemView::ExtendedSelection); return true; //一定要返回true,如果你不想别的object也能接收到这个event } } else if( event->type() == QEvent::KeyRelease) { QKeyEvent * pKeyEvent = static_cast(event); // check whether it's mid button pressed if (pKeyEvent->key() == Qt::Key_Control||pKeyEvent->key() == Qt::Key_Shift) { //do the processing and return true //textBrowserErrorInfo->setText(tr("clicked")); ui->tableWidget->setSelectionMode(QAbstractItemView::MultiSelection); return true; //一定要返回true,如果你不想别的object也能接收到这个event } } return QWidget::eventFilter(object, event); }/**/ void DialogSelectSegment2::on_pushButtonPosition_clicked() { QStringList list = SNCDataBase::getCityBySegment(ui->startEdit->text()); if(list.size()==3) { QString province = list.at(0); QString city = list.at(1); for(int i=0;irowCount();i++) { QModelIndex index = segmentModel->index(i,0,QModelIndex()); bool match = false; if(index.data(Qt::DisplayRole)==province) { for(int j=0;jrowCount();j++) { QModelIndex childIndex = index.model()->index(j,0,index); if(childIndex.data(Qt::DisplayRole)==city){ ui->treeView->setCurrentIndex(childIndex); match = true; on_treeView_clicked(childIndex); break; } } } if(match) break; } } } void DialogSelectSegment2::on_startEdit_returnPressed() { if(ui->pushButtonPosition->isEnabled()) on_pushButtonPosition_clicked(); }