2009年6月14日 星期日

QTreeWidgetItem取得上層(parent)的item text

QTreeWidgetItem要取得上一層的item text可用parent()這個函式,下面寫了好幾個方法都可取得,若要從目前這層取得到最上層只要一直parent(),用迴圈,讓後判斷是否是最上層既可,若是檔案tree,就能取得full path.

void MainWindow::on_treeWidget_itemDoubleClicked(QTreeWidgetItem* item, int column)

{
QString str1 = item->text(1); //取得第2欄text
QString str0 = item->text(0); //取得第1欄text
//QString str0 = ui->treeWidget->selectedItems().value(0)->text(0);//取得第1欄text
//QString str0 = ui->treeWidget->currentItem()->text(0); //取得第1欄text
//QString key = ui->treeWidget->currentItem()->parent()->text(0);//取得上層第1欄text
QString key = item->parent()->text(0);//取得上層第1欄text
QDir dir;
QString str2 = dir.filePath(key);
ui->listWidget->addItem(key); //把字串加到listWidget
}

下面就是一個取得檔案tree的full path,當我doubleclick,就能獲得item的檔案路徑.
QFileInfo fileInfo("/home/yplin66/qt");我是從qt目錄開展開.
只要判斷取得item text是否等於"qt",就應該終止迴圈,每取得一次text,就加到前面去,最後就是整個路徑了.

void MainWindow::on_treeWidget_itemDoubleClicked(QTreeWidgetItem* item, int column)
{
//QString str1 = item->text(1); //取得第2欄text
//QString str0 = item->text(0); //取得第1欄text
//QString str0 = ui->treeWidget->selectedItems().value(0)->text(0);//取得第1欄text
//QString str0 = ui->treeWidget->currentItem()->text(0);//取得第1欄text
//QString key = ui->treeWidget->currentItem()->parent()->text(0);//取得上層第1欄text
QString key; //QTreeWidgetItem item text
QString full_path; //檔案路徑
key = item->text(0);
full_path=key+"/";
while (key != "qt")
{
item=item->parent();
//取得上1層item
key = item->text(0); //取得上1層第1欄text
full_path=key+"/"+full_path;
}
ui->listWidget->addItem(full_path); //把字串加到listWidget
}
執行結果:(當然我最終是要獲得目錄下,所有檔案,加到list上,待續..)














終於寫完了,double click會把目錄下的檔案加到右邊的listWidget.(再來就來寫撥放音樂檔案)

void MainWindow::on_treeWidget_itemDoubleClicked(QTreeWidgetItem* item, int column)
{
//QString str1 = item->text(1); //取得第2欄text
//QString str0 = item->text(0); //取得第1欄text
//QString str0 = ui->treeWidget->selectedItems().value(0)->text(0);//取得第1欄text
//QString str0 = ui->treeWidget->currentItem()->text(0);//取得第1欄text
//QString key = ui->treeWidget->currentItem()->parent()->text(0);//取得上層第1欄text
QString key; //QTreeWidgetItem item text
QString full_path; //檔案路徑
key = item->text(0);
full_path=key+"/";
while (key != "qt")
{
item=item->parent(); //取得上1層item
key = item->text(0); //取得上1層第1欄text
full_path=key+"/"+full_path;

}
full_path="/home/yplin66/"+full_path;
QDir dir;
dir.setPath(full_path); //設到指定path
dir.setFilter(QDir::Files | QDir::NoSymLinks); //過濾檔案,目錄去掉
const QFileInfoList fileList = dir.entryInfoList(); //檔案資訊List
QFileInfo fileInfo(full_path);
QStringList fileColumn;
for (int i = 2; i < fileList.size(); i++) //0,1指. , ..故略過,一直到幾個檔案為止
{

fileInfo = fileList.at(i); //取得檔名
fileColumn.append(fileInfo.fileName()); //把檔名加到QStringList
;
}
ui->listWidget->clear();
ui->listWidget->addItems(fileColumn);//把QStringList加到listWidget

//ui->listWidget->addItem(full_path); //把字串加到listWidget
}


執行結果:


read more...

2009年6月13日 星期六

解決QT4.5.1無法在debian5.0編譯的問題

之前Qt4.5.1都是在ubuntu9.04下運行,沒問題,今天試一下debian5.0竟然不行Compiler,後來才發現,


因為少了安裝很多開發套件,只要裝上去就好了,每compiler一次就會說少那一個套件,竹一樁上去就可

,我是用Qt creator下compiler,然後Compile Out會有說少哪個套件.


cannot find -lSM

就是少libSM-dev(search libSM就找到了),反正就在l開頭後面插入ib這2個字

cannot fin -lXext就找libXext


這張是已經完成compiler了.(Compile Out)




read more...

QTreeWidget和QTreeWidgetItem和取得QTreeWidgetItem的item text

這是從網路找到加以修改,當我doubleclik QTreeWidgetItem,會把QTreeWidgetItem的text加到listWidget item,這只是初步計畫,最終我是想要點目錄,把所有的檔都加到listWidget


MainWindow::MainWindow(QWidget *parent)

: QMainWindow(parent), ui(new Ui::MainWindow)

{

ui->setupUi(this);

//樹狀目錄

QFileInfo fileInfo("/home/yplin66/qt");

QStringList fileColumn;

fileColumn.append(fileInfo.fileName());

QTreeWidgetItem *dir = new QTreeWidgetItem(fileColumn);

ui->treeWidget->addTopLevelItem(dir);

dir->setIcon(0, QIcon("caterpillar_head.jpg"));

dir->setCheckState(0, Qt::Checked); // 設定可核取的方塊

listFile(dir, fileInfo);// 查詢目錄

}





void MainWindow::listFile(QTreeWidgetItem *parentWidgetItem, QFileInfo &parent) {

QDir dir;

dir.setPath(parent.filePath());

dir.setFilter(QDir::Files | QDir::Dirs | QDir::NoSymLinks);//目錄和檔案都會顯示

//dir.setFilter(QDir::Dirs | QDir::NoSymLinks); //只顯示目錄

dir.setSorting(QDir::DirsFirst | QDir::Name);

const QFileInfoList fileList = dir.entryInfoList();

for (int i = 0; i <>

QFileInfo fileInfo = fileList.at(i);

QStringList fileColumn;

fileColumn.append(fileInfo.fileName());

if (fileInfo.fileName() == "." || fileInfo.fileName() == ".." ); // nothing

else if(fileInfo.isDir()) {

QTreeWidgetItem *child = new QTreeWidgetItem(fileColumn);

child->setIcon(0, QIcon("caterpillar_head.jpg"));

child->setCheckState(0, Qt::Checked);

parentWidgetItem->addChild(child);

// 查詢子目錄

listFile(child, fileInfo);

}

else {

fileColumn.append(QString::number(fileInfo.size()));

QTreeWidgetItem *child = new QTreeWidgetItem(fileColumn);

child->setIcon(0, QIcon("momor_head.jpg"));

child->setCheckState(0, Qt::Checked);

parentWidgetItem->addChild(child);

}

}

}



void MainWindow::on_treeWidget_itemDoubleClicked(QTreeWidgetItem* item, int column)

{

QString str1 = item->text(1); //取得第2欄text

QString str0 = item->text(0); //取得第1欄text

ui->listWidget->addItem(str0); //把字串加到listWidget

}
執行結果:

read more...

2009年6月10日 星期三

qt執行外部指令


Qt要執行外部指令,可用Qprocess
ui->comboBox->currentIndex()取得comboBox的Index是一個int
還用到switch函式

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <qprocess>
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent), ui(new Ui::MainWindow)
{
ui->setupUi(this);
}

MainWindow::~MainWindow()
{
delete ui;
}

void MainWindow::on_pushButton_pressed()
{
QString str;
int a;
a=ui->comboBox->currentIndex();
switch (a) { //switch敘述
case 0 : str="/home/tools/laker/bin/laker &" ; break ;
case 1 : str="/home/yplin66/.SH/home_sell/calibre2008-gui &" ; break ;
}
QProcess *myP = new QProcess(this); //宣告QProcess
myP->start(str);
}




來一個例子,當我選單,選laker時,按下確定紐,就可執行laker,如下圖



read more...

2009年6月9日 星期二

qt creator加上slot和調整字型,和鼠標

用Qt C reator在按鈕處按右鍵,選go to slot ...,然後他就會自動加上slot函數,把他加進slot函數就OK了
on_pushButton_4_pressed()這函數是自動加上去的,當按鈕按下就會執行這個函數,我填入了label重設text成Laker
void MainWindow::on_pushButton_4_pressed()
{
ui->label->setText("Laker");
}

下面是執行結果:

































在Qt Creator右下角,有font這項,可調整元件字型,也可改鼠標(如下圖)
















read more...

2009年5月30日 星期六

我的第一個Qt













































用了一下Qt,還真的蠻好用,先file->new->Project,一直next,專案就新增好了,在Project視窗會看到剛建的專案名稱,然後會在專案下看到mainwindow.ui,用滑鼠點一下,就可開始用滑鼠拖曳建立GUI視窗,建立好在左下有run,build all,可直接跑結果和Compiler,真方便,目前我只知道這一些,還要據續研究..............,來幾張圖

假如我們要打開上次建立的專案
File->Open->Qt Project file(*.pro)->選路徑就可看到上一次專案(如圖)













再來我們要為按鈕加動作,在按鈕按滑鼠右鍵,選Go to slot...,在選動作,就會跳到程式碼,在做編輯






































事件處裡,宣告事件的方法,每個事件都要實做,不能只處裡部份事件,不然就別宣告

又發現一個超好用的,可以用滑鼠拖拉建立signal/slot,來一張圖
















從此處可修改ui_MainWindow.h程式碼(下圖)



read more...

2009年5月29日 星期五

裝上最新版的QT
















QT被nokia買下,且open source,最近想學C++,從摩托學園看到有最新版Qt4.5.1,就下載來玩,我還不知道怎用,只是先安裝上去,界面看起來應該滿友善的.
read more...