Qt窗口
概念簡述
與QWidget的區別:
QWidget更多是作為一個窗口的一部分
基本結構構成:
以Xshell舉例子比較菜單欄和工具欄:
菜單欄:
工具欄:
工具欄本質是把菜單欄中一些比較常用的選項,直接放到工具欄中,直接點擊工具欄中的按鈕就可以快速生效
菜單欄的使用
這里需要選擇QMainWindow
通過ui文件創建菜單
創建好文件之后,打開ui文件會與之前的發生不同
如這里的“在這里輸入”,這樣就可以創建菜單了
創建好菜單欄想要創建菜單項會出現bug,無法直接輸入中文,可以通過復制粘貼的方式進行,如在記事本中輸入文本,再次粘貼到對話框中
運行結果如下:
使用代碼的方式創建菜單結構
代碼如下:
//1.創建一個菜單欄QMenuBar*menuBar=new QMenuBar();this->setMenuBar(menuBar);//2.創建菜單QMenu*menu1=new QMenu("文件");QMenu*menu2=new QMenu("編輯");QMenu*menu3=new QMenu("視圖");menuBar->addMenu(menu1);menuBar->addMenu(menu2);menuBar->addMenu(menu3);//3.給菜單添加菜單項QAction*action1=new QAction("新建");QAction*action2=new QAction("打開");QAction*action3=new QAction("保存");QAction*action4=new QAction("另存為");QAction*action5=new QAction("退出");menu1->addAction(action1);menu1->addAction(action2);menu1->addAction(action3);menu1->addAction(action4);menu1->addAction(action5);
運行結果如下:
如何讓點擊菜單項有反應?
可以給用戶添加信號槽:
//4.給action添加信號槽connect(action1,&QAction::triggered,this,&MainWindow::handle);connect(action5,&QAction::triggered,this,&MainWindow::close);
運行結果如下:
菜單添加快捷鍵
設置好快捷鍵可以結合alt使用
代碼如下:
&并不會在窗口上顯示
代碼如下:
QMenuBar*menuBar=new QMenuBar();this->setMenuBar(menuBar);QMenu*menu1=new QMenu("文件(&F)");QMenu*menu2=new QMenu("視圖(&V)");menuBar->addMenu(menu1);menuBar->addMenu(menu2);QAction*action1=new QAction("action1(&Q)");QAction*action2=new QAction("action2(&W)");QAction*action3=new QAction("action3(&E)");QAction*action4=new QAction("action4(&R)");menu1->addAction(action1);menu1->addAction(action2);menu2->addAction(action3);menu2->addAction(action4);connect(action1,&QAction::triggered,this,&MainWindow::handle1);connect(action2,&QAction::triggered,this,&MainWindow::handle2);connect(action3,&QAction::triggered,this,&MainWindow::handle3);connect(action4,&QAction::triggered,this,&MainWindow::handle4);
添加子菜單
運行結果:
添加分割線
運行結果:
添加圖標
代碼如下:
QMenuBar*menuBar=new QMenuBar();this->setMenuBar(menuBar);QMenu*menu=new QMenu("菜單");menuBar->addMenu(menu);QAction*action1=new QAction("菜單項1");action1->setIcon(QIcon(":/open.png"));QAction*action2=new QAction("菜單項2");action2->setIcon(QIcon(":/save.png"));menu->addAction(action1);menu->addAction(action2);
運行結果如下:
如果給菜單設置圖標呢?
此時只會顯示圖標,文字會被覆蓋
關于創建MenuBar的討論
QMenuBar*menuBar=new QMenuBar();this->setMenuBar(menuBar);
如果沒有點擊自動勾選ui,此代碼是OK,如果勾選則會造成內存泄漏
之前的程序已經自己創建了一個對象,當自己通過代碼設置的時候,舊的會從對象樹上脫離,導致資源泄漏
如果關閉的話,對象樹會結束,此進程也會結束,不會造成影響,但是如果頻繁切換窗口,會有問題
更規范的寫法:
QMenuBar*menuBar=this->menuBar();
如果存在直接返回,不存在會創建新的再返回
如果在以后工作中遇到嵌入式,內存很有限可能就不能夠泄漏內存