Qt 編程點滴 初學者必看 (6)
Qt 編程繼續為大家講解,還是接著文章Qt 編程點滴 初學者必看 (5) ,繼續介紹,說編程那些細節。由于本話題是一節一節為大家介紹的,所以更多內容請看末尾編輯推薦。
移交控制權
- qApp.processEvents();
相當于delphi中的application.processmessage;
Qt Script Debugger — 用于調試Qt Script的工具,可以單步運行,查看輸出等。
Qt文檔里有很詳細的一篇專門講這個的,有興趣的來看下: Qt Script Debugger Manual
Com口大于10需經特殊處理: \\\\.\\COMxx 如 \\\\.\\COM10 等價于 COM10;
透明的控件的TranslucentBackground屬性為true (繼承了parent的屬性),而非透明的控件則在代碼中強制將TranslucentBackground設為了false,這樣就造就了有意思的結果。 代碼片段如下:
- label = new QLabel(”www.cuteqt.com”);
- label->setAttribute(Qt::WA_TranslucentBackground, false); //設置為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()分別對應以上三種type。
QGraphicsView的updateSceneRect
有些時候,當你往一個QGraphicsView中添加一個空的QGraphicsScene并且批量地在這個QGraphicsScene中添加上大量的自定義的圖形對象時,會發現QGraphicsView顯示出來的圖像有些偏移:有足夠的空間來顯示這些圖形,可是有些圖形畫到QGraphicsView的邊緣去了以致于沒有完全顯示出來。
這是因為當前的消息循環還沒有處理完畢,因此QGraphicsView的槽“updateSceneRect”還沒有被調用。這樣它的sceneRect沒有刷新,就沒有將更改過大小的scene移動到中心點了。
解決辦法是在添加完畢圖形對象之后立即調用updateSceneRect,使之刷新sceneRect。
QGraphicsView繪圖問題
- 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函數中顯示出來,線會正常的畫出來.但一但有其它窗體作為主窗體,比如MainWindow,然后在其構造函數或其它函數中調用這這段代碼,view可以顯示出來,但線不會被畫出來.(無論是作為單獨的窗體還是作為MainWindow的CentralWidget都不會被畫出來,看了sample里面的幾乎完全一樣的代碼卻正常
解決方法:
scene是局部變量,函數結束后被銷毀了,應該用
- QGraphicsScene *scene = new QGraphicsScene(this);
但問題是為什么main函數中這樣用不會出問題?
因為你那個main函數沒有結束,這個函數是要到程序結束時結束的,所以那個臨時變量沒有刪除,
這樣用就沒有問題。其他的函數調用完就結束了。
查出通訊錄中代理不能取得焦點的BUG原因:MainWindow 要是繼續自QMainWindow或QWidget就取不了焦點,但如果繼承自QDialog則可以取得焦點
窗體CallingCardEdtFrm(繼承自QWidget),在此窗體上創建個組件QListWidget,QListWidget中的QListWidgetItem(里面有個QLineEdit編輯組件)的繪制與
顯示使用代理實現
- class CallingCardEdtDlg:public QDialog //如此繼承自QMainWindow或QWidget則QLineEdit獲取不了
- //焦點并且不能輸入,但如果繼承自QDialog就沒問題了
- {
- 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"));//
- }
事件原型申明中的類型定義不能加默認值。
小結:本文主要介紹了在Qt 窗體的使用,通過Qt 編程點滴介紹,也給自己提高了編程過程中需要注意的細節問題,由于本話題是一節一節為大家展現的,所以更多內容,請看編輯推薦。