/** * @brief TimerWindow::initLayout 初始化布局 */ void TimerWindow::initLayout() { //当前时间和日期说明字符串头部 headToday = QString(tr("Today Time: ")); headWeek = QString(tr("Week Time: ")); headAverage = QString(tr("Average Time: ")); headTodayDate = QString(tr("Today is: ")); headWeekDate = QString(tr("This Week: ")); //当前时间和日期控件 labelTodayDate = new QLabel(); labelTodayDate->setContentsMargins(30,15,30,3); labelTodayDate->setStyleSheet("background-color:#94BCD7;color:white"); labelWeekDate = new QLabel(); labelWeekDate->setContentsMargins(30,3,30,15); labelWeekDate->setStyleSheet("background-color:#94BCD7;color:white"); labelTodayTime = new QLabel(); labelTodayTime->setContentsMargins(30,15,30,3); labelTodayTime->setStyleSheet("background-color:#549FCF;color:white"); labelWeekTime = new QLabel(); labelWeekTime->setContentsMargins(30,3,30,3); labelWeekTime->setStyleSheet("background-color:#549FCF;color:white"); labelAverageTime = new QLabel(); labelAverageTime->setContentsMargins(30,3,30,15); labelAverageTime->setStyleSheet("background-color:#549FCF;color:white"); //当前时间和日期布局 vLayoutTimeAndDate = new QVBoxLayout(); vLayoutTimeAndDate->addWidget(labelTodayDate); vLayoutTimeAndDate->addWidget(labelWeekDate); vLayoutTimeAndDate->addWidget(labelTodayTime); vLayoutTimeAndDate->addWidget(labelWeekTime); vLayoutTimeAndDate->addWidget(labelAverageTime); vLayoutTimeAndDate->setContentsMargins(0,10,0,20); //查询部分控件 labelBeginDate = new QLabel(tr("Begin:")); labelEndDate = new QLabel(tr("End:")); labelYear = new QLabel(tr(" year")); labelMonth = new QLabel(tr(" month")); labelDay = new QLabel(tr(" day")); editBeginYear = new QLineEdit(); editBeginMonth = new QLineEdit(); editBeginDay = new QLineEdit(); editEndYear = new QLineEdit(); editEndMonth = new QLineEdit(); editEndDay = new QLineEdit(); btnSelfData = new QPushButton(tr("Self")); btnSelfData->setFixedSize(40, 25); btnSelfData->setContentsMargins(0,0,0,0); btnSelfData->setStyleSheet("background-color:#2AA0D2;color:white;border:none;margin:0;padding:0;"); btnAllData = new QPushButton(tr("All")); btnAllData->setStyleSheet("background-color:#94BCD7;color:white;border:none;margin:0;padding:0;"); btnAllData->setFixedSize(40, 25); btnAllData->setContentsMargins(0,0,0,0); btnQuery = new QPushButton(tr("Query")); btnQuery->setStyleSheet("background-color:#2AA0D2;color:white;border:none;margin:0;padding:0;"); btnQuery->setFixedSize(60,25); labelBeginDate->setFixedWidth(40); labelEndDate->setFixedWidth(40); editBeginYear->setFixedWidth(35); editBeginMonth->setFixedWidth(35); editBeginDay->setFixedWidth(35); editEndYear->setFixedWidth(35); editEndMonth->setFixedWidth(35); editEndDay->setFixedWidth(35); labelYear->setFixedWidth(40); labelMonth->setFixedWidth(40); labelDay->setFixedWidth(40); QRegExp reYear("^[0-9]{4}$"); editBeginYear->setValidator(new QRegExpValidator(reYear, this)); editEndYear->setValidator(new QRegExpValidator(reYear, this)); QRegExp reMonth("^0?[1-9]$|^1[0-2]$"); editBeginMonth->setValidator(new QRegExpValidator(reMonth, this)); editEndMonth->setValidator(new QRegExpValidator(reMonth, this)); QRegExp reDay("^0?[1-9]$|^[1-2][0-9]$|^3[0-1]$"); editBeginDay->setValidator(new QRegExpValidator(reDay, this)); editEndDay->setValidator(new QRegExpValidator(reDay, this)); //查询布局 gLayoutDate = new QGridLayout(); gLayoutDate->addWidget(btnSelfData,0,0,1,1); gLayoutDate->addWidget(btnAllData,0,1,1,1); gLayoutDate->addWidget(labelBeginDate,0,3,1,1); gLayoutDate->addWidget(editBeginYear,0,4,1,1); gLayoutDate->addWidget(labelYear,0,5,2,1); gLayoutDate->addWidget(editBeginMonth,0,6,1,1); gLayoutDate->addWidget(labelMonth,0,7,2,1); gLayoutDate->addWidget(editBeginDay,0,8,1,1); gLayoutDate->addWidget(labelDay,0,9,2,1); gLayoutDate->addWidget(labelEndDate,1,3,1,1); gLayoutDate->addWidget(editEndYear,1,4,1,1); // gLayoutDate->addWidget(labelYear,1,2,1,1); gLayoutDate->addWidget(editEndMonth,1,6,1,1); // gLayoutDate->addWidget(labelMonth,1,4,1,1); gLayoutDate->addWidget(editEndDay,1,8,1,1); // gLayoutDate->addWidget(labelDay,1,6,1,1); gLayoutDate->addWidget(btnQuery,0,10,2,1); gLayoutDate->addWidget(labelYear,0,2,1,1); gLayoutDate->setContentsMargins(0,0,0,0); gLayoutDate->setSpacing(1); //绘图对象 customPlot = new QCustomPlot(); customPlot->setFixedSize(500, 250); //按钮布局 // hLayoutBtn = new QHBoxLayout(); // hLayoutBtn->addWidget(btnSelfData); // hLayoutBtn->addWidget(btnAllData); // hLayoutBtn->setSpacing(0); // hLayoutBtn->setAlignment(btnSelfData, Qt::AlignLeft); // hLayoutBtn->setAlignment(btnAllData, Qt::AlignLeft); // hLayoutBtn->setMargin(0); //主布局 vLayoutMain = new QVBoxLayout(); // vLayoutMain->addWidget(labelTodayDate); // vLayoutMain->addWidget(labelWeekDate); // vLayoutMain->addWidget(labelTodayTime); // vLayoutMain->addWidget(labelWeekTime); // vLayoutMain->addWidget(labelAverageTime); // vLayoutMain->addLayout(hLayoutBtn); vLayoutMain->addLayout(vLayoutTimeAndDate); vLayoutMain->addLayout(gLayoutDate); vLayoutMain->addWidget(customPlot); vLayoutMain->setAlignment(gLayoutDate, Qt::AlignLeft); vLayoutMain->setAlignment(gLayoutDate, Qt::AlignLeft); vLayoutMain->setSpacing(0); vLayoutMain->setContentsMargins(40,0,40,0); this->setLayout(vLayoutMain); }
QUrl ImdbParser::Parse( const QByteArray& data ) { DebugPrintFunc( "ImdbParser::Parse", data.size() ); QString foundedPage( data ); RegExpTools::SimplifyText( foundedPage ); QRegExp reRedirect( "class=\"number\">1.</td><td class=\"title\"><a href=\"(.*)\">"); QString redirectUrl( RegExpTools::ParseItem( foundedPage, reRedirect ) ); QUrl posterUrl; if( !redirectUrl.isEmpty() ) { redirectUrl = "http://www.imdb.com" + redirectUrl; QString str( request.runSync( QUrl( redirectUrl ) ) ); RegExpTools::SimplifyText( str ); DebugPrint( QString( "Simpified to: %1 bytes" ).arg( str.size() ) ); // Title QRegExp reTitle( "h1 itemprop=\"name\".*>(.*)<span" ); film.SetColumnData( FilmItem::TitleColumn, RegExpTools::ParseItem( str, reTitle ) ); // Original title QRegExp reOriginalTitle( "div class=\"originalTitle\">(.*)<span" ); film.SetColumnData( FilmItem::OriginalTitleColumn, RegExpTools::ParseItem( str, reOriginalTitle ) ); // Tagline QRegExp reTagline( "Taglines:</h4>(.*)<" ); film.SetColumnData( FilmItem::TaglineColumn, RegExpTools::ParseItem( str, reTagline ) ); // Year QRegExp reYear( "Release Date:</h4>.*([0-9]{4})" ); film.SetColumnData( FilmItem::YearColumn, RegExpTools::ParseItem( str, reYear ).toInt() ); // Budget QRegExp reBudget( "Budget:</h4> \\$(.*)<span" ); film.SetColumnData( FilmItem::BudgetColumn, RegExpTools::ParseItem( str, reBudget ).replace( " ", "" ).toDouble() ); // Rating QRegExp reRating( "itemprop=\"ratingValue\">(.*)</span>" ); film.SetColumnData( FilmItem::RatingColumn, RegExpTools::ParseItem( str, reRating ).replace( ",", "." ).toDouble() ); // Country QRegExp reCountryList( "Countr.*</h4>(.*)</div>" ); QRegExp reCountry( "href=\"/country/.*>(.*)</a>" ); film.SetColumnData( FilmItem::CountryColumn, RegExpTools::ParseList( str, reCountryList, reCountry ) ); // Genre QRegExp reGenreList( "Genres:</h4>(.*)</div>" ); QRegExp reGenre( "href=\"/genre/.*>(.*)</a>" ); film.SetColumnData( FilmItem::GenreColumn, RegExpTools::ParseList( str, reGenreList, reGenre ) ); // Description QRegExp reDescription( "Storyline</h2><.*><p>(.*)<em class=\"nobr\">" ); film.SetColumnData( FilmItem::DescriptionColumn, RegExpTools::ParseItem( str, reDescription ).replace( "<br><br>", "<br>\n" ) ); // Advanced information QRegExp reName( "itemprop=\"name\">(.*)</span>" ); if( AlexandraSettings::GetInstance()->GetParsersLoadAdvancedInfo() ) { QString str( request.runSync( QUrl( redirectUrl + "fullcredits" ) ) ); RegExpTools::SimplifyText( str ); DebugPrint( QString( "Simpified to: %1 bytes" ).arg( str.size() ) ); // Starring QRegExp reStarringList( "Cast <span>(.*)Produced by" ); film.SetColumnData( FilmItem::StarringColumn, RegExpTools::ParseList( str, reStarringList, reName, 20 ) ); // 20 first actors // Director QRegExp reDirectorList( "Directed by(.*)Writing Credits" ); reName = QRegExp( "href=\"/name/.*>(.*)</a>" ); film.SetColumnData( FilmItem::DirectorColumn, RegExpTools::ParseList( str, reDirectorList, reName, 10 ) ); // 10 first directors // Screenwriter QRegExp reScreenwriterList( "Writing Credits(.*)Cast" ); film.SetColumnData( FilmItem::ScreenwriterColumn, RegExpTools::ParseList( str, reScreenwriterList, reName, 10 ) ); // 10 first writers // Producer QRegExp reProducerList( "Produced by(.*)Music by" ); film.SetColumnData( FilmItem::ProducerColumn, RegExpTools::ParseList( str, reProducerList, reName, 10 ) ); // 10 first producers // Composer QRegExp reComposerList( "Music by(.*)Film Editing by" ); film.SetColumnData( FilmItem::ComposerColumn, RegExpTools::ParseList( str, reComposerList, reName ) ); } else { // Starring QRegExp reStarringList( "Cast</h2>(.*)</table>" ); film.SetColumnData( FilmItem::StarringColumn, RegExpTools::ParseList( str, reStarringList, reName ) ); // Director QRegExp reDirectorList( "Director.*</h4>(.*)</div>" ); QRegExp reName( "itemprop=\"name\">(.*)</span>" ); film.SetColumnData( FilmItem::DirectorColumn, RegExpTools::ParseList( str, reDirectorList, reName ) ); // Screenwriter QRegExp reScreenwriterList( "Writer.*</h4>(.*)</div>" ); film.SetColumnData( FilmItem::ScreenwriterColumn, RegExpTools::ParseList( str, reScreenwriterList, reName ) ); } // Poster if( AlexandraSettings::GetInstance()->GetParsersLoadBigPoster() ) { QRegExp rePoster( "div class=\"poster\"><a href=\"(.*)\"" ); QString s = QString( request.runSync( QUrl( "http://www.imdb.com" + RegExpTools::ParseItem( str, rePoster ) ) ) ); RegExpTools::SimplifyText( s ); DebugPrint( QString( "Simpified to: %1 bytes" ).arg( s.size() ) ); rePoster = QRegExp( "id=\"primary-img\".*src=\"(.*)\"" ); posterUrl = RegExpTools::ParseItem( s, rePoster ); } if( posterUrl.isEmpty() ) // Small poster { QRegExp rePoster( "div class=\"poster\"><.*><img.*src=\"(.*)\"" ); posterUrl = RegExpTools::ParseItem( str, rePoster ); } DebugPrint( "Text parsed!" ); emit Loaded( film, posterUrl ); } else { emit Error( "Movie not found!" ); } return( posterUrl ); }