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ì)的一篇專門講這個(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:
- //寫入文件;
- 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)顯示這些圖形,可是有些圖形畫到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ì)正常的畫出來(lái).但一但有其它窗體作為主窗體,比如MainWindow,然后在其構(gòu)造函數(shù)或其它函數(shù)中調(diào)用這這段代碼,view可以顯示出來(lái),但線不會(huì)被畫出來(lái).(無(wú)論是作為單獨(dú)的窗體還是作為MainWindow的CentralWidget都不會(huì)被畫出來(lái),看了sample里面的幾乎完全一樣的代碼卻正常
解決方法:
scene是局部變量,函數(shù)結(jié)束后被銷毀了,應(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"));//
- }
事件原型申明中的類型定義不能加默認(rèn)值。
小結(jié):本文主要介紹了在Qt 窗體的使用,通過(guò)Qt 編程點(diǎn)滴介紹,也給自己提高了編程過(guò)程中需要注意的細(xì)節(jié)問(wèn)題,由于本話題是一節(jié)一節(jié)為大家展現(xiàn)的,所以更多內(nèi)容,請(qǐng)看編輯推薦。