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