当前位置: 首页 > 工具软件 > Dillo > 使用案例 >

用dillo内核做的一个浏览器

邓阳嘉
2023-12-01

由于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();   

                                        

}

 类似资料: