Qt 編程點(diǎn)滴 初學(xué)者必看 (6)
Qt 編程繼續(xù)為大家講解,還是接著文章Qt 編程點(diǎn)滴 初學(xué)者必看 (5) ,繼續(xù)介紹,說(shuō)編程那些細(xì)節(jié)。由于本話題是一節(jié)一節(jié)為大家介紹的,所以更多內(nèi)容請(qǐng)看末尾編輯推薦。
移交控制權(quán)
- qApp.processEvents();
 
相當(dāng)于delphi中的application.processmessage;
Qt Script Debugger — 用于調(diào)試Qt Script的工具,可以單步運(yùn)行,查看輸出等。
Qt文檔里有很詳細(xì)的一篇專(zhuān)門(mén)講這個(gè)的,有興趣的來(lái)看下: Qt Script Debugger Manual
Com口大于10需經(jīng)特殊處理: \\\\.\\COMxx 如 \\\\.\\COM10 等價(jià)于 COM10;
透明的控件的TranslucentBackground屬性為true (繼承了parent的屬性),而非透明的控件則在代碼中強(qiáng)制將TranslucentBackground設(shè)為了false,這樣就造就了有意思的結(jié)果。 代碼片段如下:
- label = new QLabel(”www.cuteqt.com”);
 - label->setAttribute(Qt::WA_TranslucentBackground, false); //設(shè)置為false完全不透明
 - label->setAutoFillBackground(true);
 
怎樣將日志輸出到文件中
- void myMessageOutput( QtMsgType type, const char *msg )
 - {
 - switch ( type ) {
 - case QtDebugMsg:
 - //寫(xiě)入文件;
 - break;
 - case QtWarningMsg:
 - break;
 - case QtFatalMsg:
 - abort();
 - }
 - }
 - int main( int argc, char** argv )
 - {
 - QApplication app( argc, argv );
 - qInstallMsgHandler( myMessageOutput );
 - ......
 - return app.exec();
 - }
 
qDebug(), qWarning(), qFatal()分別對(duì)應(yīng)以上三種type。
QGraphicsView的updateSceneRect
有些時(shí)候,當(dāng)你往一個(gè)QGraphicsView中添加一個(gè)空的QGraphicsScene并且批量地在這個(gè)QGraphicsScene中添加上大量的自定義的圖形對(duì)象時(shí),會(huì)發(fā)現(xiàn)QGraphicsView顯示出來(lái)的圖像有些偏移:有足夠的空間來(lái)顯示這些圖形,可是有些圖形畫(huà)到QGraphicsView的邊緣去了以致于沒(méi)有完全顯示出來(lái)。
這是因?yàn)楫?dāng)前的消息循環(huán)還沒(méi)有處理完畢,因此QGraphicsView的槽“updateSceneRect”還沒(méi)有被調(diào)用。這樣它的sceneRect沒(méi)有刷新,就沒(méi)有將更改過(guò)大小的scene移動(dòng)到中心點(diǎn)了。
解決辦法是在添加完畢圖形對(duì)象之后立即調(diào)用updateSceneRect,使之刷新sceneRect。
QGraphicsView繪圖問(wèn)題
- QGraphicsScene scene;
 - scene.setSceneRect(0, 0, 800, 800);
 - QGraphicsLineItem *line = new QGraphicsLineItem(0, 0, 500, 500);
 - scene.addItem(line);
 - QGraphicsView *view = new QGraphicsView(&scene);
 
上面這段代碼,如果把view作為主窗體在main函數(shù)中顯示出來(lái),線會(huì)正常的畫(huà)出來(lái).但一但有其它窗體作為主窗體,比如MainWindow,然后在其構(gòu)造函數(shù)或其它函數(shù)中調(diào)用這這段代碼,view可以顯示出來(lái),但線不會(huì)被畫(huà)出來(lái).(無(wú)論是作為單獨(dú)的窗體還是作為MainWindow的CentralWidget都不會(huì)被畫(huà)出來(lái),看了sample里面的幾乎完全一樣的代碼卻正常
解決方法:
scene是局部變量,函數(shù)結(jié)束后被銷(xiāo)毀了,應(yīng)該用
- QGraphicsScene *scene = new QGraphicsScene(this);
 
但問(wèn)題是為什么main函數(shù)中這樣用不會(huì)出問(wèn)題?
因?yàn)槟隳莻€(gè)main函數(shù)沒(méi)有結(jié)束,這個(gè)函數(shù)是要到程序結(jié)束時(shí)結(jié)束的,所以那個(gè)臨時(shí)變量沒(méi)有刪除,
這樣用就沒(méi)有問(wèn)題。其他的函數(shù)調(diào)用完就結(jié)束了。
查出通訊錄中代理不能取得焦點(diǎn)的BUG原因:MainWindow 要是繼續(xù)自QMainWindow或QWidget就取不了焦點(diǎn),但如果繼承自QDialog則可以取得焦點(diǎn)
窗體CallingCardEdtFrm(繼承自QWidget),在此窗體上創(chuàng)建個(gè)組件QListWidget,QListWidget中的QListWidgetItem(里面有個(gè)QLineEdit編輯組件)的繪制與
顯示使用代理實(shí)現(xiàn)
- class CallingCardEdtDlg:public QDialog //如此繼承自QMainWindow或QWidget則QLineEdit獲取不了
 - //焦點(diǎn)并且不能輸入,但如果繼承自QDialog就沒(méi)問(wèn)題了
 - {
 - Q_OBJECT
 - public:
 - CallingCardEdtDlg(QWidget*);
 - };
 - CallingCardEdtDlg::CallingCardEdtDlg(QWidget* parent)
 - :QDialog(parent)
 - {
 - CallingCardEdtForm * frm = new CallingCardEdtForm(0);
 - frm->setGeometry(0,0,200,200);
 - QStackedWidget* stackedWidget = new QStackedWidget(0);
 - stackedWidget->addWidget(frm);
 - stackedWidget->setCurrentIndex(0);
 - QGraphicsScene* scene = new QGraphicsScene();
 - QGraphicsView* view = new QGraphicsView(scene);
 - view->setParent(this);
 - QGraphicsProxyWidget* proxyWidget = new QGraphicsProxyWidget();
 - proxyWidget->setCacheMode(QGraphicsItem::DeviceCoordinateCache);
 - proxyWidget->setWidget(stackedWidget);
 - scene->addItem(proxyWidget);
 - //view->resize(200,200);
 - view->setRenderHints(QPainter::Antialiasing | QPainter::SmoothPixmapTransform);
 - //view->setBackgroundBrush(QPixmap(":/No-Ones-Laughing-3.jpg"));
 - view->setCacheMode(QGraphicsView::CacheBackground);
 - view->setViewportUpdateMode(QGraphicsView::BoundingRectViewportUpdate);
 - view->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
 - view->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
 - view->setBackgroundBrush(QColor("#151C28"));//
 - }
 
事件原型申明中的類(lèi)型定義不能加默認(rèn)值。
小結(jié):本文主要介紹了在Qt 窗體的使用,通過(guò)Qt 編程點(diǎn)滴介紹,也給自己提高了編程過(guò)程中需要注意的細(xì)節(jié)問(wèn)題,由于本話題是一節(jié)一節(jié)為大家展現(xiàn)的,所以更多內(nèi)容,請(qǐng)看編輯推薦。















 
 
 
 
 
 
 