Hey, I have built a small Phonon based media player as part of a college
project.
I need to add mpris2 support to it for remote control using kde connect.
When trying to run the application I get the following error:

QWidget: Must construct a QApplication before a QPaintDevice

I already have a QApplication constructed in main.cpp but I still get the
error.

Attached is the Mpris2 implementation (basically modified from the Dragon
Player source code) Can anyone please tell me where I am going wrong? I am
not really familiar with D-Bus and the Mpris specification.

PS: the full repository is at https://www.github.com/Zakhrov/WebPhonon
#include "appwrapper.h"
#include "mainwindow.h"
#include <KDE/KCmdLineArgs>

AppWrapper::AppWrapper():KUniqueApplication(true,true),w(0)
{

}

AppWrapper::~AppWrapper()
{
    if(w)
    {
        w=0;
    }
    delete w;
}

int AppWrapper::newInstance()
{
    if(!w)
    {
        w=new MainWindow;
    }
    w->showMaximized();
    return KUniqueApplication::newInstance();
}


#ifndef APPWRAPPER_H
#define APPWRAPPER_H
#include <KDE/KUniqueApplication>

class MainWindow;
class AppWrapper : public KUniqueApplication
{
    Q_OBJECT
public:
    AppWrapper();
    ~AppWrapper();
    virtual int newInstance();
private:
    MainWindow *w;
};

#endif // APPWRAPPER_H
#ifndef CODEINE_H
#define CODEINE_H
class QWidget;

QWidget *mwindow();

int main(int,char**);

#define APP_NAME "WebPhonon"
#endif // CODEINE_H
#include <QtGui/QApplication>
//#include "mainwindow.h"
#include "codeine.h"
#include "appwrapper.h"
#include <QCoreApplication>
#include <QPixmap>
#include <QSplashScreen>
#include <QTextStream>
//#include <kcmdlineargs.h>
//#include <kurl.h>
//#include <kaboutdata.h>
#include <KDE/KCmdLineArgs>
#include <KDE/KUrl>
#include <KDE/KAboutData>
#include <KDE/KUniqueApplication>


int main(int argc, char *argv[])
{
    KAboutData aboutData( "WebPhonon", "WebPhonon",
          ki18n("WebPhonon"), "1.5",
          ki18n("Media Player"),
          KAboutData::License_GPL,
          ki18n("Copyright (c) 2013 Zakhrov") );

    KCmdLineArgs::init( argc, argv, &aboutData );
    KCmdLineOptions options; //new
      options.add("+[file]", ki18n("Document to open")); //new
      KCmdLineArgs::addCmdLineOptions(options); //new
    KUniqueApplication::addCmdLineOptions();

    QApplication a(argc, argv);
    QCoreApplication::setApplicationName("WebPhonon");
    AppWrapper app;
    QPixmap img;
    img.load(":/splash/WebPhonon-Master-text2.png");
    QSplashScreen spl;
    spl.setPixmap(img);
    spl.show();

   // QStringList cmd=a.arguments();
//    QTextStream cout(stdout);
//    cout<<argv[0]<<endl;
//    cout<<argv[1]<<endl;

//    if(!cmd.isEmpty())
//    {
//        w.cmdopen(cmd.last());
//    }
    /*KCmdLineArgs *args = KCmdLineArgs::parsedArgs(); //new
     if(args->count()) //new
     {
         app(args->url(0).url()); //new
     }*/
    //w.showMaximized();
    return app.exec();

}
/* this is the main player window for WebPhonon. Here, a phonon graph is built that handles the audio and video
  from the various locations such as local files, http streams and from a database table
  The current databases supported are MySQL for Linux/Windows and
  Microsoft SQL Server as a windows only option.
  MS SQL support is not fully tested.
  TODO
  Add media from disks such as CD, DVD and Blu-Ray this means that fututre dependencies may include libdvdcss2 and libbluray
  Add proper media scanner and tagger for pulling metadata for a video file (like XBMC)
*/
#include "dialog.h"
#include "dbmainwindow.h"
#include "backenddialog.h"
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include "helpdialog.h"
#include "dropwidget.h"
#include "mpris2.h"
#include <Phonon/AudioOutput>
#include <Phonon/MediaObject>
#include <QFileDialog>
#include <Phonon/BackendCapabilities>
#include <QDesktopServices>
#include <QSqlDatabase>
#include <QTableWidgetItem>
#include <QSqlQuery>
#include <QMessageBox>
#include <Phonon/VideoWidget>
#include <KDE/KCmdLineArgs>
#include <KDE/KUrl>
//#include <stdlib.h>
//#include <boost/filesystem/
      MainWindow * MainWindow::s_instance=0;
       QWidget* mwindow() { return MainWindow::s_instance; }
      DropWidget *MainWindow::dwidget=new DropWidget();
      Phonon::MediaObject *MainWindow::med=new Phonon::MediaObject();
MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    //setting window icon and initializing objects
    this->setWindowIcon(QIcon(":/icons/WebPhononIcon.png"));
    ui->setupUi(this);
    d=new Dialog(this);

    dm2=new DBMainWindow(this);
    bkdiag=new BackendDialog(this);
    hdiag=new HelpDialog(this);
    sndout=new Phonon::AudioOutput(Phonon::VideoCategory,this);
    //MainWindow::med=new Phonon::MediaObject(this);
    //MainWindow::dwidget=new DropWidget(this);
    med->setTransitionTime(2000);
    Phonon::createPath(med,dwidget);
    Phonon::createPath(med,sndout);
    QStringList collabel;
    collabel.append("URL");
    collabel.append("Name");
    ui->seekSlider->setMediaObject(med);
    ui->volumeSlider->setAudioOutput(sndout);
    ui->volumeSlider->setTracking(true);
    ui->lineEdit->hide();
    urls.clear();
    ui->tableWidget->hide();
     ui->tableWidget->setColumnCount(2);
     ui->tableWidget->setHorizontalHeaderLabels(collabel);
     ui->pushButton->hide();
     //connecting signals and slots for going to next file and for drag n drop
   connect(med,SIGNAL(aboutToFinish()),this,SLOT(next()));
   connect(dwidget,SIGNAL(geturls(const QMimeData*)),this,SLOT(dropdata(const QMimeData*)));
   connect(dwidget,SIGNAL(capturespace(QKeyEvent*)),this,SLOT(widgetpause(QKeyEvent*)));
   connect(med,SIGNAL(tick(qint64)),this,SLOT(timechanged(qint64)));
   connect(med,SIGNAL(totalTimeChanged(qint64)),this,SLOT(totalTimeChanged(qint64)));
   //adding custom video widget with drag n drop enabled
    ui->gridLayout->addWidget(dwidget);
    ui->seekSlider->setIconVisible(false);
    volume=sndout->volumeDecibel();
    ui->label->setText(QString::number(volume));
    s_instance=this;
    Mpris2(this);


}

void MainWindow::cmdopen(QString cmdfile)
{
    int i;
    int index=sources.size();

    sources.append(Phonon::MediaSource(QUrl(cmdfile)));
    QTableWidgetItem *fitem=new QTableWidgetItem(cmdfile,1);
    i=ui->tableWidget->rowCount();
    ui->tableWidget->insertRow(i);
    ui->tableWidget->setItem(i,0,fitem);
    if(med->state()!=Phonon::PlayingState)
    {

        if(!sources.isEmpty())
       med->setCurrentSource(sources.at(index));
       med->play();
       ui->tableWidget->selectRow(index);
    }

    ui->tableWidget->resizeColumnsToContents();

}
MainWindow::~MainWindow()
{
    MyDB.close();
    delete ui;
}
void MainWindow::on_actionLocal_File_triggered()
{
 //this function/slot triggers a dialog box for selecting files and adds files to the tablewidget (playlist)
    int i;
    int index=sources.size();
    QStringList fnames=QFileDialog::getOpenFileNames(this,tr("Choose Files"),QDesktopServices::storageLocation(QDesktopServices::MoviesLocation));
    foreach (QString fname, fnames) {
        sources.append(Phonon::MediaSource(QUrl::fromLocalFile(fname)));
        QTableWidgetItem *fitem=new QTableWidgetItem(fname,1);
        i=ui->tableWidget->rowCount();
        ui->tableWidget->insertRow(i);
        ui->tableWidget->setItem(i,0,fitem);
    }

     ui->tableWidget->resizeColumnsToContents();

     if(med->state()!=Phonon::PlayingState)
     {

         if(!sources.isEmpty())
        med->setCurrentSource(sources.at(index));
        med->play();
        ui->tableWidget->selectRow(index);
     }

}



void MainWindow::on_actionHttp_Stream_triggered()
{

   //shows th url bar for adding http streams
    ui->lineEdit->show();
    ui->pushButton->show();

}

void MainWindow::on_actionPlay_triggered()
{
    med->play();
    ui->lineEdit->hide();
    ui->pushButton->hide();
    ui->tableWidget->selectRow(sources.indexOf(med->currentSource()));
}

void MainWindow::on_actionPause_triggered()
{
    if(med->state()==Phonon::PlayingState)
    med->pause();
    else
        med->play();
}

void MainWindow::on_actionStop_triggered()
{
    med->stop();
}

void MainWindow::on_actionFull_Screen_triggered()
{

   if(dwidget->isFullScreen()==false)
   { 
       dwidget->setFullScreen(true);
       dwidget->setFocus();

   }
   else
   {

      dwidget->setFullScreen(false);
   }


}

void MainWindow::on_actionExit_triggered()
{
    this->close();
}

void MainWindow::on_actionSet_Database_triggered()
{
    //opens the set database dialog
    d->show();

}

void MainWindow::on_actionFrom_Database_triggered()
{
    //queries the database for media information and urls
    QString tabindex,titleindex,studio,language,artist,album,year;
    int i;
    int index=sources.size();
    HostName=d->host;
    DBName=d->dbname;
    UName=d->uname;
    Passwd=d->passwd;
    TabName=d->tabname;
    DBType=d->dbtype;
    QPixmap img1,img2;
    img1.load(":/Icons/WebPhononIcon.png");
    img2=img1.scaled(32,32);
    QMessageBox msg;
    msg.setIconPixmap(img2);
    msg.setWindowTitle("Database Module");
    MyDB=QSqlDatabase::addDatabase(DBType);
    MyDB.setConnectOptions();
    if(MyDB.isDriverAvailable(DBType)==true)
    {
        if(DBType=="QODBC")
        {
            QString dsn= QString("DRIVER={SQL Server};SERVER=%1;DATABASE=%2;Trusted_Connection=Yes;").arg(HostName).arg(DBName);
           MyDB.setDatabaseName(dsn);
           MyDB.open();
        }
        else
        {
            if(HostName=="localhost")
            {
                MyDB.setHostName(HostName);
                MyDB.setDatabaseName(DBName);
            }
            else
            {
                MyDB.setHostName(HostName);
                MyDB.setPort(3306);
                MyDB.setDatabaseName(DBName);
            }
            MyDB.open(UName,Passwd);
        }

        if(MyDB.isOpen()==true)
        {
              msg.setText(MyDB.driverName()+" Database "+DBName+" Open");
              msg.exec();
        }
        if(!MyDB.tables().contains(TabName))
        {
            msg.setText(TabName+" does not exist");
            msg.exec();
        }
        else if(TabName=="Movies")
        {
            ui->tableWidget->setColumnCount(5);
            QStringList Moviecollabel;
            QString rating;
            Moviecollabel.append("URL");
            Moviecollabel.append("Title");
            Moviecollabel.append("Studio");
            Moviecollabel.append("Language");
            Moviecollabel.append("Rating");
            ui->tableWidget->setHorizontalHeaderLabels(Moviecollabel);
            QSqlQuery request("SELECT url, Title, Studio, Language, rating FROM "+TabName);
            while(request.next())
            {

                tabindex=request.value(0).toString();
                titleindex=request.value(1).toString();
                studio=request.value(2).toString();
                language=request.value(3).toString();
                rating=request.value(4).toString();
                sources.append(Phonon::MediaSource(QUrl(request.value(0).toString())));
                QTableWidgetItem *item1=new QTableWidgetItem(tabindex,1);
                QTableWidgetItem *item2=new QTableWidgetItem(titleindex,1);
                QTableWidgetItem *item3=new QTableWidgetItem(studio,1);
                QTableWidgetItem *item4=new QTableWidgetItem(language,1);
                QTableWidgetItem *item5=new QTableWidgetItem(rating,1);
                i=ui->tableWidget->rowCount();
                ui->tableWidget->insertRow(i);
                ui->tableWidget->setItem(i,0,item1);
                ui->tableWidget->setItem(i,1,item2);
                ui->tableWidget->setItem(i,2,item3);
                ui->tableWidget->setItem(i,3,item4);
                ui->tableWidget->setItem(i,4,item5);
            }
        }
        else if(TabName=="Music")
        {
            ui->tableWidget->setColumnCount(6);
            QStringList Musiccollabel;
            Musiccollabel.append("URL");
            Musiccollabel.append("Title");
            Musiccollabel.append("Artist");
            Musiccollabel.append("Album");
            Musiccollabel.append("Year");
            Musiccollabel.append("Language");
            ui->tableWidget->setHorizontalHeaderLabels(Musiccollabel);
            QSqlQuery request("SELECT url, Title, artist, album, year, language FROM "+TabName);
            while(request.next())
            {

                tabindex=request.value(0).toString();
                titleindex=request.value(1).toString();
                artist=request.value(2).toString();
                album=request.value(3).toString();
                year=request.value(4).toString();
                language=request.value(5).toString();
                sources.append(Phonon::MediaSource(QUrl(request.value(0).toString())));
                QTableWidgetItem *item1=new QTableWidgetItem(tabindex,1);
                QTableWidgetItem *item2=new QTableWidgetItem(titleindex,1);
                QTableWidgetItem *item3=new QTableWidgetItem(artist,1);
                QTableWidgetItem *item4=new QTableWidgetItem(album,1);
                QTableWidgetItem *item5=new QTableWidgetItem(year,1);
                QTableWidgetItem *item6=new QTableWidgetItem(language,1);
                i=ui->tableWidget->rowCount();
                ui->tableWidget->insertRow(i);
                ui->tableWidget->setItem(i,0,item1);
                ui->tableWidget->setItem(i,1,item2);
                ui->tableWidget->setItem(i,2,item3);
                ui->tableWidget->setItem(i,3,item4);
                ui->tableWidget->setItem(i,4,item5);
                ui->tableWidget->setItem(i,5,item6);
            }
        }
        else if(TabName=="Music_Videos")
        {
            QString ishd;
            int hd;
            ui->tableWidget->setColumnCount(5);
            QStringList MVidcollabel;
            MVidcollabel.append("URL");
            MVidcollabel.append("Title");
            MVidcollabel.append("Artist");
            MVidcollabel.append("Language");
            MVidcollabel.append("HD");
            ui->tableWidget->setHorizontalHeaderLabels(MVidcollabel);
            QSqlQuery request("SELECT url, Title, artist, language, HD FROM "+TabName);
            while(request.next())
            {

                tabindex=request.value(0).toString();
                titleindex=request.value(1).toString();
                artist=request.value(2).toString();
                language=request.value(3).toString();
                hd=request.value(4).toInt();
                if(hd==1)
                    ishd="yes";
                else
                    ishd="no";
                sources.append(Phonon::MediaSource(QUrl(request.value(0).toString())));
                QTableWidgetItem *item1=new QTableWidgetItem(tabindex,1);
                QTableWidgetItem *item2=new QTableWidgetItem(titleindex,1);
                QTableWidgetItem *item3=new QTableWidgetItem(artist,1);
                QTableWidgetItem *item4=new QTableWidgetItem(language,1);
                QTableWidgetItem *item5=new QTableWidgetItem(ishd,1);
                i=ui->tableWidget->rowCount();
                ui->tableWidget->insertRow(i);
                ui->tableWidget->setItem(i,0,item1);
                ui->tableWidget->setItem(i,1,item2);
                ui->tableWidget->setItem(i,2,item3);
                ui->tableWidget->setItem(i,3,item4);
                ui->tableWidget->setItem(i,4,item5);
            }
        }
        else if(TabName=="TV_Shows")
        {
            int season,episode;
            QString eptitle;
            ui->tableWidget->setColumnCount(5);
            QStringList TVcollabel;
            TVcollabel.append("URL");
            TVcollabel.append("Title");
            TVcollabel.append("Season");
            TVcollabel.append("Episode");
            TVcollabel.append("Episode Title");
            ui->tableWidget->setHorizontalHeaderLabels(TVcollabel);
            QSqlQuery request("SELECT url, Title, Season, Episode, Ep_Title FROM "+TabName);
            while(request.next())
            {

                tabindex=request.value(0).toString();
                titleindex=request.value(1).toString();
                season=request.value(2).toInt();
                episode=request.value(3).toInt();
                eptitle=request.value(4).toString();

                sources.append(Phonon::MediaSource(QUrl(request.value(0).toString())));
                QTableWidgetItem *item1=new QTableWidgetItem(tabindex,1);
                QTableWidgetItem *item2=new QTableWidgetItem(titleindex,1);
                QTableWidgetItem *item3=new QTableWidgetItem(QString::number(season),1);
                QTableWidgetItem *item4=new QTableWidgetItem(QString::number(episode),1);
                QTableWidgetItem *item5=new QTableWidgetItem(eptitle,1);
                i=ui->tableWidget->rowCount();
                ui->tableWidget->insertRow(i);
                ui->tableWidget->setItem(i,0,item1);
                ui->tableWidget->setItem(i,1,item2);
                ui->tableWidget->setItem(i,2,item3);
                ui->tableWidget->setItem(i,3,item4);
                ui->tableWidget->setItem(i,4,item5);
            }
        }
        else
        {
            QSqlQuery request("SELECT url, Title FROM "+TabName);
            while(request.next())
            {

                tabindex=request.value(0).toString();
                titleindex=request.value(1).toString();
                sources.append(Phonon::MediaSource(QUrl(request.value(0).toString())));
                QTableWidgetItem *item1=new QTableWidgetItem(tabindex,1);
                QTableWidgetItem *item2=new QTableWidgetItem(titleindex,1);
                i=ui->tableWidget->rowCount();
                ui->tableWidget->insertRow(i);
                ui->tableWidget->setItem(i,0,item1);
                ui->tableWidget->setItem(i,1,item2);
            }
        }
        ui->tableWidget->resizeColumnsToContents();
        ui->tableWidget->show();
        if(med->state()!=Phonon::PlayingState)
        {
            if(!sources.isEmpty())
                med->setCurrentSource(sources.at(index));
            ui->tableWidget->selectRow(index);
            med->play();
        }

        MyDB.close();
    }
    else
    {
        msg.setText("Database Driver not Loaded");
        msg.exec();
    }

}

void MainWindow::on_actionManage_Databases_triggered()
{
    //shows database manager window
    dm2->showMaximized();
}


void MainWindow::on_tableWidget_cellClicked(int row, int column)
{
    if(column==0)
    {

        med->stop();
        med->clearQueue();
        if(row>=sources.size())
            return;
        med->setCurrentSource(sources[row]);
        med->play();


    }
}

void MainWindow::on_actionHide_Table_triggered()
{
    if(ui->tableWidget->isHidden()==true)
    ui->tableWidget->show();
    else
        ui->tableWidget->hide();
    ui->lineEdit->hide();
    ui->pushButton->hide();

}
void MainWindow::on_pushButton_clicked()
{
    //adds url typed in url bar to playlist
    int i;
    QString uname;
    uname.insert(0,ui->lineEdit->text());
    int index=sources.size();
    sources.append(Phonon::MediaSource(QUrl(uname)));
    QTableWidgetItem *uitem=new QTableWidgetItem(uname,1);
    i=ui->tableWidget->currentRow();
    ui->tableWidget->insertRow(i+1);
    ui->tableWidget->setItem(i+1,0,uitem);
     ui->tableWidget->resizeColumnsToContents();
     ui->lineEdit->hide();
     ui->pushButton->hide();
     if(med->state()!=Phonon::PlayingState)
     {
         if(!sources.isEmpty())
             med->setCurrentSource(sources.at(index));
            ui->tableWidget->selectRow(index);
         med->play();
     }

}

void MainWindow::on_actionAvailable_Formats_triggered()
{
    bkdiag->show();
}

void MainWindow::next()
{

    this->on_actionFoward_triggered();
}

void MainWindow::on_actionUser_Manual_triggered()
{
    //opens user manual
    hdiag->showMaximized();
}

void MainWindow::dropdata(const QMimeData *mimeData)
{
    //activates drag n drop
    int i;
    int index=sources.size();
    if (mimeData->hasUrls()) {
             foreach (QUrl url, mimeData->urls()) {
                 sources.append(Phonon::MediaSource(url));
                QTableWidgetItem *uitem=new QTableWidgetItem(url.toString(),1);
                i=ui->tableWidget->rowCount();
                ui->tableWidget->insertRow(i);
                ui->tableWidget->setItem(i,0,uitem);
             }
             ui->tableWidget->resizeColumnsToContents();

             if(med->state()!=Phonon::PlayingState)
             {

                 if(!sources.isEmpty())
                med->setCurrentSource(sources.at(index));
                 ui->tableWidget->selectRow(index);
                med->play();
             }
    }
}

void MainWindow::parseArgs()
{
  KCmdLineArgs *args = KCmdLineArgs::parsedArgs();
  if(args->count()>0)
      cmdopen(args->url(0).url());
}

void MainWindow::on_actionBack_triggered()
{
   // if(sources.size()>0)
    //{
        int index=sources.indexOf(med->currentSource());
//        QString size=QString::number(index);
//        QMessageBox *sizedisp=new QMessageBox(this);
//        sizedisp->setText(size);
//        sizedisp->show();
        if(index!=0)
        {
            med->setCurrentSource(sources.at(index-1));
            ui->tableWidget->selectRow(index-1);
            med->play();
        }
        else
        {
            med->setCurrentSource(sources.at(index));
            ui->tableWidget->selectRow(index);
            med->play();
         }




}

void MainWindow::on_actionFoward_triggered()
{
    int index=sources.indexOf(med->currentSource())+1;

       if(sources.size()>index)
       {
            med->setCurrentSource(sources.at(index));
            ui->tableWidget->selectRow(index);
            med->play();
       }
}

void MainWindow::widgetpause(QKeyEvent *event)
{


    switch(event->key())
    {
        case Qt::Key_Space: if(med->state()==Phonon::PlayingState)
            med->pause();
        else
            med->play();
        break;
    case Qt::Key_MediaPrevious:this->on_actionBack_triggered();
        break;
    case Qt::Key_MediaNext:this->on_actionFoward_triggered();
        break;
    case Qt::Key_MediaStop: med->stop();;
        break;
    case Qt::Key_F: if(dwidget->isFullScreen())
            dwidget->setFullScreen(false);
        else
            dwidget->setFullScreen(true);
        break;
    case Qt::Key_Right:this->on_actionSkip_Foward_triggered();
        break;
    case Qt::Key_Left: this->on_actionSkip_Backward_triggered();
        break;
    case Qt::Key_Up: this->on_actionVolume_Up_triggered();
        break;
    case Qt::Key_Down: this->on_actionVolume_Down_triggered();
        break;

    default: med->play();
    }


}

void MainWindow::on_actionVolume_Up_triggered()
{
    if(volume<=50)
    {
        volume=volume+0.5;
        ui->label->setText(QString::number(volume));
        ui->volumeSlider->audioOutput()->setVolumeDecibel(volume);
    }
}

void MainWindow::on_actionVolume_Down_triggered()
{
    if(volume>=-50)
    {
        volume=volume-0.5;
        ui->label->setText(QString::number(volume));
        ui->volumeSlider->audioOutput()->setVolumeDecibel(volume);
    }

}

void MainWindow::on_actionSkip_Foward_triggered()
{
    currenttime=med->currentTime();
    if(currenttime < med->totalTime()-10000)
    ui->seekSlider->mediaObject()->seek(currenttime+10000);
}

void MainWindow::on_actionSkip_Backward_triggered()
{
    currenttime=med->currentTime();
    if(currenttime > 10000)
        ui->seekSlider->mediaObject()->seek(currenttime-10000);

}

void MainWindow::timechanged(qint64 time)
{
   qint64 hour,min,sec,dispsec,dmin;
    hour=min=dmin=0;
    time=med->currentTime();
    sec=time/1000;
    dispsec=sec;
    if(sec>59)
    {
        min=sec/60;
        dispsec=sec%60;
        dmin=min;

    }
    if(min>59)
    {
        hour=min/60;
        dmin=min%60;
    }
    ui->hourlabel1->setText(QString::number(hour));
    ui->minlabel1->setText(QString::number(dmin));
    ui->slabel1->setText(QString::number(dispsec));



}

void MainWindow::totalTimeChanged(qint64 newtottime)
{
    qint64 hour,min,sec,dispsec,dmin;
     hour=min=sec=dispsec=dmin=0;
     newtottime=med->totalTime();
     sec=newtottime/1000;
     dispsec=sec;
     if(sec>59)
     {
         min=sec/60;
         dispsec=sec%60;
         dmin=min;
     }
     if(min>59)
     {
         hour=min/60;
         dmin=min%60;
     }
     ui->hourlabel2->setText(QString::number(hour));
     ui->minlabel2->setText(QString::number(dmin));
     ui->slabel2->setText(QString::number(dispsec));


}

void MainWindow::on_actionClear_Playlist_triggered()
{
    sources.clear();
    int i, rcnt;
    rcnt=ui->tableWidget->rowCount();
    ui->tableWidget->clearContents();
    for(i=0;i<=rcnt;i++)
    {
        ui->tableWidget->removeRow(i);
    }

}
#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
//#include <phonon/phonon>
#include <Phonon/MediaObject>
#include <Phonon/AudioOutput>
#include <QPlainTextEdit>
#include "dialog.h"
#include "dbmainwindow.h"
#include "backenddialog.h"
#include "helpdialog.h"
#include "dropwidget.h"
#include "codeine.h"
#include <QSqlDatabase>
#include <QWebView>
#include <QTableWidgetItem>
#include <Phonon/VideoWidget>

namespace Ui {
class MainWindow;
}

class MainWindow : public QMainWindow
{
    Q_OBJECT
    
public:
    explicit MainWindow(QWidget *parent = 0);
    void cmdopen(QString cmdfile);
    static Phonon::MediaObject *med;
    static DropWidget *dwidget;
    friend QWidget *mwindow();
          static MainWindow *s_instance;
          friend class AppWrapper;



    ~MainWindow();

public slots:
    void dropdata(const QMimeData *mimeData);
    void parseArgs();
private slots:

    void on_actionLocal_File_triggered();

    void on_actionHttp_Stream_triggered();

    void on_actionPlay_triggered();

    void on_actionPause_triggered();

    void on_actionStop_triggered();

    void on_actionFull_Screen_triggered();

    void on_actionExit_triggered();

    void on_actionSet_Database_triggered();

    void on_actionFrom_Database_triggered();

    void on_actionManage_Databases_triggered();

    void on_tableWidget_cellClicked(int row, int column);

    void on_actionHide_Table_triggered();

    void on_pushButton_clicked();

    void on_actionAvailable_Formats_triggered();

    void next();

    void on_actionUser_Manual_triggered();

    void on_actionBack_triggered();

    void on_actionFoward_triggered();
    void widgetpause(QKeyEvent *event);

    void on_actionVolume_Up_triggered();

    void on_actionVolume_Down_triggered();

    void on_actionSkip_Foward_triggered();

    void on_actionSkip_Backward_triggered();
    void timechanged(qint64 time);
    void totalTimeChanged(qint64 newtottime);


    void on_actionClear_Playlist_triggered();

private:
    Ui::MainWindow *ui;
    Phonon::AudioOutput *sndout;
    Dialog *d;
    QSqlDatabase MyDB;
    QString HostName,DBName,UName,Passwd,TabName,DBType;
    QList<QUrl> urls;
    QList <Phonon::MediaSource> sources;
    DBMainWindow *dm2;
    QTableWidgetItem *item;
    BackendDialog *bkdiag;
    HelpDialog *hdiag;
    qreal volume;
    qint64 currenttime;



};
//Phonon::MediaObject MainWindow::med;
//DropWidget MainWindow::dwidget;

#endif // MAINWINDOW_H
#include "mediaplayer2.h"
#include "dropwidget.h"
#include "mainwindow.h"
#include "mpris2.h"
#include "codeine.h"
#include <QtDBus/QDBusAbstractAdaptor>
#include <QApplication>

MediaPlayer2::MediaPlayer2(QObject * parent) : QDBusAbstractAdaptor(parent)
{
    connect(MainWindow::med,SIGNAL(hasVideoChanged(bool)),this,SLOT(emitFullscreenChange(bool)));
}

bool MediaPlayer2::CanQuit() const
{
    return true;
}

bool MediaPlayer2::Fullscreen() const
{
    return MainWindow::dwidget->isFullScreen();
}

void MediaPlayer2::setFullscreen(bool fullscreen) const
{
    MainWindow::dwidget->setFullScreen(fullscreen);
}

bool MediaPlayer2::CanSetFullscreen() const
{
    return MainWindow::med->hasVideo();
}



void MediaPlayer2::quit()
{

}

void MediaPlayer2::emitFullscreenChange(bool fullscreen) const
{
    QVariantMap properties;
    properties["Fullscreen"] = fullscreen;
    properties["CanSetFullscreen"] = CanSetFullscreen();
    Mpris2::signalPropertiesChange(this,properties);
}


#ifndef MEDIAPLAYER2_H
#define MEDIAPLAYER2_H
#include "codeine.h"
#include<QtDBus/QDBusAbstractAdaptor>

class MediaPlayer2 :QDBusAbstractAdaptor
{
    Q_OBJECT
     Q_PROPERTY(bool CanQuit READ CanQuit)
    Q_PROPERTY(bool Fullscreen READ Fullscreen WRITE setFullscreen)
    Q_PROPERTY(bool CanSetFullscreen READ CanSetFullscreen)

public:
    MediaPlayer2(QObject* parent);
            bool CanQuit() const;
            bool Fullscreen() const;
            void setFullscreen(bool fullscreen) const;
            bool CanSetFullscreen() const;

public slots:
    void quit();
private slots:

            void emitFullscreenChange(bool fullscreen) const;

};

#endif // MEDIAPLAYER2_H
#include "mediaplayer2player.h"
#include "mainwindow.h"
#include "mpris2.h"
#include "dropwidget.h"
#include "codeine.h"
#include <QtDBus/QDBusAbstractAdaptor>
#include <QCryptographicHash>

static QByteArray makeTrackId(const QString& source)

{

    return QByteArray("/org/kde/") + APP_NAME + "/tid_" + QCryptographicHash::hash(source.toLocal8Bit(), QCryptographicHash::Sha1).toHex();

}

MediaPlayer2Player::MediaPlayer2Player(QObject *parent): QDBusAbstractAdaptor(parent)
{
    connect(MainWindow::med,SIGNAL(currentSourceChanged(Phonon::MediaSource)),this,SLOT(currentSourceChanged()));
}

bool MediaPlayer2Player::CanGoNext() const
{

        return false;
}

bool MediaPlayer2Player::CanGoPrevious() const
{
    return false;
}

bool MediaPlayer2Player::CanPlay() const
{
    return true;
}

bool MediaPlayer2Player::CanPause() const
{
    return MainWindow::med->state()!= Phonon::ErrorState;
}

QVariantMap MediaPlayer2Player::Metadata() const
{
    QVariantMap metadata;
    switch(MainWindow::med->currentSource().type())
    {
        case Phonon::MediaSource::Invalid:
    case Phonon::MediaSource::Empty:
                  break;
    default:
        metadata["mpris:length"]=MainWindow::med->totalTime();

    }
    return metadata;
}

void MediaPlayer2Player::Next() const
{
    //MainWindow::on_actionFoward_triggered();
}

void MediaPlayer2Player::Previous() const
{
    //MainWindow::on_actionBack_triggered();
}

void MediaPlayer2Player::Pause() const
{
    MainWindow::med->pause();
}

void MediaPlayer2Player::Stop() const
{
    MainWindow::med->stop();
}

void MediaPlayer2Player::Play() const
{
    MainWindow::med->play();
}

void MediaPlayer2Player::currentSourceChanged() const
{
        QVariantMap properties;
         properties["Metadata"] = Metadata();
             Mpris2::signalPropertiesChange(this, properties);
}
#ifndef MEDIAPLAYER2PLAYER_H
#define MEDIAPLAYER2PLAYER_H
#include "codeine.h"
#include<QtDBus/QDBusAbstractAdaptor>
#include <Phonon/MediaSource>
#include<QtDBus/QDBusObjectPath>
#include <QVariantMap>

class MediaPlayer2Player: public QDBusAbstractAdaptor
{
    Q_OBJECT
    Q_PROPERTY(bool CanGoNext READ CanGoNext)
    Q_PROPERTY(bool CanGoPrevious READ CanGoPrevious)
    Q_PROPERTY(bool CanPlay READ CanPlay)
    Q_PROPERTY(bool CanPause READ CanPause)

public:
    MediaPlayer2Player(QObject * parent);
    bool CanGoNext() const;
    bool CanGoPrevious() const;
    bool CanPlay() const;
    bool CanPause() const;
    QVariantMap Metadata() const;

public slots:
    void Next() const;

    void Previous() const;

    void Pause() const;

    void Stop() const;

    void Play() const;
private slots:
            void currentSourceChanged() const;


};

#endif // MEDIAPLAYER2PLAYER_H
#include "mpris2.h"
#include "mediaplayer2.h"
#include "mediaplayer2player.h"
#include "codeine.h"
#include <QtDBus/QDBusConnection>
#include <QtDBus/QDBusMessage>
#include <QMetaClassInfo>
#include <QStringList>
#include <unistd.h>

Mpris2::Mpris2(QObject *parent) :
    QObject(parent)
{
        QString mpris2Name("org.mpris.MediaPlayer2.WebPhonon");
        bool success = QDBusConnection::sessionBus().registerService(mpris2Name);
        if (!success)
            success = QDBusConnection::sessionBus().registerService(mpris2Name + ".instance" + QString::number(getpid()));
        if (success)
        {
            new MediaPlayer2(this);
            new MediaPlayer2Player(this);
            QDBusConnection::sessionBus().registerObject("/org/mpris/MediaPlayer2", this, QDBusConnection::ExportAdaptors);

        }


}

void Mpris2::signalPropertiesChange(const QObject *adaptor, const QVariantMap &properties)
{
    QDBusMessage msg=QDBusMessage::createSignal("/org/mpris/MediaPlayer2","org.freedesktop.DBus.Properties","PropertiesChanged");
    QVariantList args;
    args<<adaptor->metaObject()->classInfo(0).value();
    args<<properties;
    args<<QStringList();
    msg.setArguments(args);
    QDBusConnection::sessionBus().send(msg);
}
#ifndef MPRIS2_H
#define MPRIS2_H
#include "codeine.h"
#include <QObject>
#include <QVariantMap>

class Mpris2 : public QObject
{
    Q_OBJECT
public:
    explicit Mpris2(QObject *parent = 0);

    static void signalPropertiesChange(const QObject* adaptor, const QVariantMap& properties);

signals:

public slots:

};

#endif // MPRIS2_H
>> Visit http://mail.kde.org/mailman/listinfo/kde-devel#unsub to unsubscribe <<

Reply via email to