天天看點

用dillo核心做的一個浏覽器

由于qt提供了良好的嵌入其它視窗的功能,如QX11EmbedContainer類就可以将其它視窗捕獲,并使之成為自己的一部分。使用浏覽器dillo的核心,做了一個适合普通使用者的浏覽器界面。浏覽器dillo是一個GTK程式,有兩種方法将它嵌入qt界面:


a)      先得到gtk視窗的id,然後将這個id傳遞給qt程序的QX11EmbedContainer對象,再調用embedClient(WId)函數将gtk視窗加到qt裡面. 得到gtk視窗id使用函數 GDK_WINDOW_XWINDOW (GTK_WIDGET (window1)->window);


b)      首先在我們的界面internetpage中建立一個widget,用winId()函數得到它的視窗id,然後在打開浏覽器dillo程序的指令中使用-x ****(得到的id号),即可,如list << "dillo" << "-f" << "-g 765x540" << "-x" << temp <<"/r"。-g 765x540是指定視窗的初始大小。


由于浏覽器dillo提供了-x參數,隻需給它指定一個視窗ID就可以了,是以我們用了第二種方法。


1.     界面設計


1)        在界面上提供了一個軟鍵盤,專們用于網址的輸入,是以去掉了其它特殊的按鍵。輸入方法和使用鍵盤輸入類似,輸入完畢,點選Enter鍵即可登入網際網路,浏覽網頁。


2)        浏覽器增加了最近浏覽功能,當使用者輸入網址時,系統會自動搜尋使用者浏覽過的網頁位址,并把與輸入比對的所有網址讀列出來,使用者可以通過選擇列出來的網址打開網頁,就像使用IE浏覽器一樣的的效果。


3)        最近浏覽功能的實作


使用者通路過的網址存在history.txt檔案中,在輸入網頁的過程中,每輸入一個字元,都會把目前位址欄的内容與原來存在檔案的内容比較,并列出與目前輸入比對的網頁位址。當使用者浏覽一個history.txt檔案中不存在的網址時,該位址會自動記錄到history.txt檔案中。


 


截圖:


 


 


實作代碼:


//internetpage.h


class InternetPage : public QWidget//網際網路類的聲明


{   Q_OBJECT


public:


InternetPage(QWidget *parent = 0);


QFrame *frame;


My_GroupBox *internetGroup;


My_LineEdit *lineEdit;


void web();


void showweb();


public slots:                   


void keyboard();


void showkeyboard();


void enter();


void add();


void select(QListWidgetItem *);


private:


unsigned long wid;


QProcess *browser;


QPushButton *enterbutton;


QListWidget *weblist;


QFile *file;


QList<QString> fitweb;


QPushButton *button1;


QPushButton *button2;


QPushButton *button3;


QPushButton *button4;


QPushButton *button5;


QPushButton *button6;


QPushButton *button7;


QPushButton *button8;


QPushButton *button9;


QPushButton *button0;


QPushButton *buttonQ;


QPushButton *buttonW;


QPushButton *buttonE;


QPushButton *buttonR;


QPushButton *buttonT;


QPushButton *buttonY;


QPushButton *buttonU;


               QPushButton *buttonI;


               QPushButton *buttonO;


               QPushButton *buttonP;


 


               QPushButton *buttonA;


               QPushButton *buttonS;


               QPushButton *buttonD;


               QPushButton *buttonF;


               QPushButton *buttonG;


               QPushButton *buttonH;


               QPushButton *buttonJ;


               QPushButton *buttonK;


               QPushButton *buttonL;


               QPushButton *buttonColon;


 


               QPushButton *buttonZ;


               QPushButton *buttonX;


               QPushButton *buttonC;


               QPushButton *buttonV;


               QPushButton *buttonB;


               QPushButton *buttonN;


               QPushButton *buttonM;


               QPushButton *buttonDot;


               QPushButton *buttonXie;


 


               QPushButton *buttonEnter;


               


               QPushButton *buttondel;


};


 


 


//internetpage.cpp


InternetPage::InternetPage(QWidget *parent)//網際網路類的定義


    : QWidget(parent)


{


           internetGroup = new My_GroupBox(tr(""));


           connect(internetGroup, SIGNAL(mousepressed(QMouseEvent*)), parent, SLOT(mousePressEvent(QMouseEvent*)));


 


           QLabel *address = new QLabel("Address",internetGroup);


           address->setGeometry(QRect(1,0,60,30));


           lineEdit = new My_LineEdit(internetGroup);


           lineEdit->setGeometry(QRect(66,0,699,30));            


               connect(lineEdit,SIGNAL(mousepressed()),this,SLOT(showkeyboard()));  


 


 


    


           QX11EmbedWidget *contain = new QX11EmbedWidget(internetGroup);


           contain->setGeometry(0,35,800,560);


           wid = contain->winId();


           web();//顯示網頁内容


               keyboard();//構造一個鍵盤


               file = new QFile("history.txt");//建立一個檔案,存放最近通路過的網頁


               connect(weblist, SIGNAL(itemPressed(QListWidgetItem *)), this,SLOT(select(QListWidgetItem *)));


 


 


           QVBoxLayout *mainLayout = new QVBoxLayout;


           mainLayout->addWidget(internetGroup);


           mainLayout->addSpacing(12);


           mainLayout->addStretch(1);


           setLayout(mainLayout);


           internetGroup->setMinimumSize(600,560);


}


 


//打開浏覽器,并記錄新輸入的網頁位址


void InternetPage::showweb()


{


               int flag;


       browser->kill();


               QStringList list;


             QString temp;


               temp.setNum(wid);//獲得frame的id,并轉化為QString型的資料


 


               QString address;


               address = lineEdit->text();


               


               //file = new QFile("history.txt"); 


               if (!file->open(QIODevice::ReadWrite | QIODevice::Text))


                  printf("open file history to read1 error.......");


               QTextStream in(file);


               while (!in.atEnd()) {


                    QString line = in.readLine();


                    if(QString::compare(address,line)==0)


                       flag=1;          


               }


               printf("the flag is %d/n....",flag);


               file->close();


               if (!file->open(QIODevice::Append | QIODevice::Text))


                  printf("open file history to write error.......");


               if(flag!=1)


               {QTextStream out(file);


                out<<address<<"/n";


                }


               


               list << "dillo" << "-f" << "-g 765x540" << "-x" << temp << address<<"/r";//全屏,初始大小,視窗位置


               QString str = list.join(" ");


              


               browser = new QProcess();


               //char *wedsite = str.toStdString().c_str()


               browser->start(str.toStdString().c_str(),QIODevice::ReadWrite);


               file->close();


}


//完成浏覽網址的比對。


void InternetPage::add()


{


               weblist->clear();


               if (!file->open(QIODevice::ReadWrite | QIODevice::Text))


                  printf("open file history to read error.......");


               QTextStream in(file);


               QString getText;


               getText = lineEdit->text();


               while (!in.atEnd()) {


                    QString line = in.readLine();


                    if(line.contains(getText,Qt::CaseInsensitive))


                    {


                     fitweb.append(line);


                    QListWidgetItem *item = new QListWidgetItem(line);


                    item->setFont(QFont("Times",18,QFont::Bold));                 


                    //item->setText(file.section("/", -1));                  


                    item->setTextColor(QColor(225,0,225));            


               


                    weblist->insertItem(fitweb.size(),item);}


               }


               file->close();    


                                         


}
      

繼續閱讀