Qt控件的使用

1. 控件位置的確定
控件的位置一般來說是相對其父的其左上角的座標:
QWidget *w = new QWidget(this);
QPoint p = w->pos();
int x = p.x();
int y = p.y();
若要得到其針對全局界面的座標值,則需要轉換一下,用mapToGlobal():
QPoint p(0, 0);
int x = mapToGlobal(p).x();
int y = mapToGlobal(p).y();

2. QWidget
(1) 對widget的顯示和隱藏
QWidget *w = new QWidget(this);
w->setHidden(true); //隱藏
w->setHidden(false); //顯示
(2) 用QWidget實現彈出窗口的效果
QWidget *w = new QWidget("test", this, "mySplashScreen", WStyle_Customize | WStyle_Tool );//WStyle_Splash
w->setMinimumSize(100, 100);
w->show();
實際上,彈出窗口QDialog就是來源於QWidget,所以能用QLabel這樣的類定義出窗口效果也就不奇怪了。
另外用WidgetFlags的不同搭配還可以實現其它效果,如:
WStyle_Customize | WType_Modal //模式對話框(WType_Modal= WStyle_Dialog | WShowModal)
WStyle_Customize | WStyle_StaysOnTop | WType_TopLevel //彈出在最上端
注:在QT4裏貌似用w->setWindowModality(Qt::WindowModal);也能實現模式對話框,但沒驗證過。

3. QLabel
(1) 定義
QLabel* m_labelOrdered = new QLabel("0", this);
(2) 對文字的左右對齊設置
m_labelOrdered->setAlignment(Qt::AlignLeft);//左對齊
其它還有,橫向對齊:
Qt::AlignAuto – 根據語言內容,大部分是左對齊。右對齊的有:阿拉伯語、希伯來(現代以色列)語
Qt::AlignLeft – 居左
Qt::AlignRight – 居右
Qt::AlignHCenter – 居中
Qt::AlignJustify – 兩端對齊。並不是所有時候都有效,有時會被AlignAuto中斷
豎向對齊:
Qt::AlignTop – 居頂
Qt::AlignBottom – 居底
Qt::AlignVCenter – 居中
同時只可以使用一個橫向或豎向對齊方式。但是還有一個同時設置橫豎方向的標記:
Qt::AlignCenter – 橫豎都居中

內容自動換行:

QLabel::WordBreak

但是,幫助手冊上說:BreakAnywhere標記在QLabel是不支持的。

如果一定有這樣的需求,可以考慮下面兩個方法:

(1) 在setText()時,用HTML串賦值,裏面加上換行符

(2) 使用QTextEdit代替。設置:read-only/frame trued off/its palette's window/background brush set to no-brush。用QTextEdit還有一個好處,就是可以對內容進行賦值粘貼。

4. QPixmap
(1) 定義和賦值
QPixmap pix;
pix.load("images/typebutton.PNG");
QPixmap pix("images/typebutton.PNG");
QPixmap pix = new QPixmap("images/typebutton.PNG");
(2) 如何實現QT背景圖片拉伸
方法一
int w = 10;
int h = 20;
QPixmap pix("test.png");
QImage qimage = pix.convertToImage();
qimage = qimage.scale(w, h, QImage::ScaleFree);
pix.convertFromImage(qimage, QPixmap::Auto);
方法二(貌似是4.0以上版本的,沒驗證過)
QWidget *widget = new QWidget();
widget->setAutoFillBackground(true); // 這句要加上, 否則可能顯示不出背景圖.
QPalette palette = widget->palette();
palette.setBrush(QPalette::Window,
QBrush(QPixmap("1.png").scaled( // 縮放背景圖.
widget->size(),
Qt::IgnoreAspectRatio,
Qt::SmoothTransformation))); //使用平滑的縮放方式
widget->setPalette(palette); // 至此, 已給widget加上了背景圖.
(3) 對圖片灰度的處理
QImage qimage = pix.convertToImage();
pix.convertFromImage(qimage, QPixmap::Mono);//黑白,而且顆粒感很強,不太好看
(4) 背景圖片按實際大小比例顯示
首先,覆蓋控件的paintEvent事件
然後,在事件處理時獲得控件的實際大小
最後,按照上面的方法一拉伸背景圖片,再覆蓋原背景圖片
代碼如下:
//m_pmBackGroundPixmap是要顯示的背景圖片(QPixmap)
//m_lbPixLabel是自定義label控件(QLabel)
//getStretchPixmap(int w, int h, QPixmap pix)是按照6方法寫的公共函數
void BPixmapButtonBase::paintEvent( QPaintEvent *e)
{
QRect rect = e->rect();
m_pmBackGroundPixmap = getStretchPixmap(rect.width(), rect.height(), m_pmBackGroundPixmap);//
m_lbPixLabel->setBackgroundPixmap(m_pmBackGroundPixmap);
}
(5) qt中顯示gif、png、jpg和jpeg圖片
轉自:http://hi.baidu.com/ys_shuoshu/blog/item/d53cbfbd20a9710619d81fff.html
qt中顯示gif和png圖片的方法比較簡單,在編譯libqte-mt.so文件時分別添加參數-qt-gif和-qt-libpng就可以了。
顯示jpg和jpeg圖片就稍微複雜一點,首先編譯libqte-mt.so文件時要添加參數-qt-libjpeg和-qt-imgfmt-jpeg,然後拷貝plugins下的imageformats目錄到文件系統目錄下,我放在了/qte/plugins下,最後在main函數中添加QApplication::addLibraryPath("/qte/plugins");這樣顯示jpg和jpeg圖片的環境就準備好了。
顯示圖片的使用setPixmap(<路徑>);方法
補充:這裏使用的qt版本爲3.3.8
(6) 用QImage實現圖片壓縮(改變尺寸大小)
通過縮小圖片的尺寸來實現圖片的壓縮,實際上就是上面圖片拉伸的另一種應用。
首先,將原始文件讀到QImage對象裏;再用scale()函數設置目標尺寸;再用save()函數保存到本地。
bool QImage::save(const QString &fileName, const char* format, int quality=-1) const
fileName:可以是相對路徑,也可以是絕對路徑
format:想保存的圖片格式。常用的有:JPEG、PNG、BMP
要想知道一個圖片的格式是什麼,可以用函數:
const char* QImage::imageFormat(const QString &fileName) [static];
例子:
QImage im("images/testimage.jpg"); //大小爲 73.3KB
im = im.scale(50, 50, QImage::ScaleFree);
if(im.save("images/small_testimage.jpg", "JPEG")) //大小爲 1.8KB
qDebug("ButtonGroupForm::testImage save success!");
else
qDebug("ButtonGroupForm::testImage save fail!");

5. QString
(1) 給QString賦值
QString s = “sss”;
也可以:
s.sprintf(“sss %d”, 2);
(2) int怎麼轉換成QString
int i=0;
//靜態函數的方法
QString s = QString::number(i, 10);//10表示10進制,也可以不寫,默認就是10進制
//非靜態函數的方法
QString::setNum ( ulong n, int base = 10 )
這兩個函數同樣使用於其他數字類型,如:uint, long, float, bouble等
(3) float、double轉換成QString
同上面的函數相同,若想規定輸出格式,則可通過參數設定。
QString QString::number ( double n, char f = 'g', int prec = 6 ) [static]
setNum()也一樣。f是表示輸出的格式,prec是保留的小數位數,被截取的部分四捨五入。
Format Meaning
e format as [-]9.9e[+|-]999
E format as [-]9.9E[+|-]999
f format as [-]9.9
g use e or f format, whichever is the most concise
G use E or f format, whichever is the most concise
例1:
double d = 12.34;
QString ds = QString( "'E' format, precision 3, gives %1" ).arg( d, 0, 'E', 3 );
// ds == "1.234E+001"
例2 保留兩位小數:
float f = 1.2;
float f2 = 1.567;
qDebug("inputForm::init : s=" + QString::number(f, 'f', 2)); //s=1.20
qDebug("inputForm::init : s2=" + QString::number(f2, 'f', 2));//s2=1.57
(4) QString怎麼轉換成其它類型
若是int、float等數字型,有直接的對應轉換函數。如:toInt(bool *ok=0, int base=10)等
QString s = "10";
int i = s.toInt();
若是char*型,則有:ascii()。如:
char *c = s.ascii();
(5) 怎麼比較兩個QString的內容
直接使用==,>=, <=,<,>,!=等。
(6) 取子串
QString支持取左、取右、取中間,如下:
QString s(“Five pineapples”);
QString l = s.left(4); //l = “Five”
QString r = s.right(6); //r = “apples”
QString m = s.mid( 5, 4 ); // t = “pine”

6. QLineEdit
(1)密碼框的實現
QLineEdit,將echoMode屬性設置成:Password
這樣,輸入的字符都是圓點顯示

7. QDialog
(1)動態定義、彈出對話框
qt對話框類是QDialog ( QWidget * parent = 0, const char * name = 0, bool modal = FALSE, WFlags f = 0 )
modal:指是否模式對話框,也可以用setModal(bool)改變設置;
f:指窗口的樣式。
如:
DDishDetailForm *dishDetailForm = new DDishDetailForm( this->parentWidget(), "dishdetailform", TRUE, WStyle_Customize | WStyle_NoBorder);
定義了一個DDishDetailForm的彈出窗口,模式對話框,無邊框。
彈出對話框,可以用:
dishDetailForm->show();//顯示的模式按照對應的爲準
也可以用:
dishDetailForm->exec();//則無論定義的modal設置的是什麼,都按照模式對話框顯示

(2) 使用QTDesigner導航生成的Form
雖然導航生成的Form也是繼承自QDialog,但是它封裝了構造函數和析構函數。但是它分別在兩個函數裏默認調用了init()和destroy()兩個函數。
所以要想做什麼初始化的操作就定義一個init()函數,寫在裏面。
要想在析構函數裏做什麼就定義一個destroy()函數,寫在裏面。

8. QComboBox
(1)屬性設置
設置下拉的高度,高度是可見的item行數:
comboBox->setSizeLimit(5); //5行
如果不想使用滾動條,而是固定高度,橫向擴展顯示,則做下面設置即可:
m_comboBox->listBox()->setColumnMode(QListBox::Variable);//默認即是
m_comboBox->listBox()->setVariableWidth(true); //使下拉列表的寬度可變
m_comboBox->listBox()->setRowMode(QListBox::FitToHeight); //行數和下拉的高度一致(不出現滾動條)
chartTypeTextLabel->setBuddy( chartTypeComboBox );

9. QTable
詳見《QTable使用詳解.doc》

10. QDate、 QTime and QDateTime
QT提供了三個日期時間方面的類:QDate、QTime、QDateTime。使用方法都差不多,也非常方便。三個類都包含在頭文件<qdatetime.h>中。
(1) 以QDateTime爲例,說明獲取當前時間的使用方法。
方法:currentDataTime()
因爲是靜態函數,所以不需要定義對象。返回的是QDateTime對象,若想轉換成格式字符串,使用toString()函數即可。例子如下:
QString ss = (QDateTime::currentDateTime()).toString("yyyy-MM-dd hh:mm:ss");// 2010-02-20 15:55:51
(2) 用QTime計算運行時間
方法:int elapsed() const
用這個函數可以很方便的測試出一段代碼運行所需要的時間,而不需自己手動計算。
QTime t;
//開始第一次計算
t.start();
//…要運行的代碼段…
qDebug( "Time elapsed: %d ms", t.elapsed() );
//開始第二次計算
t.restart();
//…要運行的代碼段…
qDebug( "Time elapsed: %d ms", t.elapsed() );

11. QProgressDialog
我們處理耗費時間的操作時經常會用到滾動條。直接上代碼:
#include <qapplication.h>
int NumRows = 10;
QProgressDialog progress(tr("Saving file..."), tr("Cancel"), NumRows);
progress.setModal(true);
for (int row = 0; row < NumRows; ++row) {
progress.setProgress(row);
qApp->processEvents();
if (progress.wasCanceled()) {
//dosomething
return;
}
}
說明:
NumRows,進度條的總步數,QProgressDialog會根據這個數自動算出每一步走多少長度。
QApplication::processEvents()用來處理任何repaint事件(如,接受用戶點擊Cancel按鈕)(但是好像不寫這句也可以)。
我們不調用show()函數,是因爲QProgressDialog自己已經做了。如果這個過程變得極短,則dialog根本不會被顯示。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章