Qt學習:QAction系列詳解

一、QAction類詳解

【詳細描述】

??????? QAction類提供了抽象的用戶界面action,這些action可以被放置在窗口部件中。

??????? 應用程序可以通過菜單,工具欄按鈕以及鍵盤快捷鍵來調用通用的命令。由于用戶期望每個命令都能以相同的方式執行,而不管命令所使用的用戶界面,

這個時候使用action來表示這些命令就顯得十分有用。

???????? Actions可以被添加到菜單和工具欄中,并且可以自動保持在菜單和工具欄中的同步。例如,在一個字處理軟件中,如果用戶在工具欄中按下了Bold按鈕,那么菜單中的Bold選項就會自動被選中。

???????? Actions可以作為獨立的對象被創建,但是我們也可以在構建菜單的時候創建它們;QMenu類包含了非常簡便的方法用于創建適合用作菜單項的actions。

?????? QAction可以包括一個圖標,菜單文本,快捷鍵,狀態文本,"What`s This"文本以及一個tooltip。這些內容的絕大部分都可以在構造函數中設置。也可以通過setIcon(),setIconText(),setShortCut(),setStatusTip(),setWhatsThis和SetToolTip()函數分別設置。對于菜單項,我們還可以通過

setFont()單獨為它們設置font。

?????? 可以通過QWidget::addAction()或者是QGraphicsWidget::addAction()函數將Actions添加到窗口部件上。注意,只有將Actions添加到窗口部件上之后,我們才可以使用這些actions;當actions的快捷鍵是全局的時候,我們也必須先將actions添加到窗口部件上。

?????? 一旦QAction被創建了,那么就必須將它添加到相關的菜單和工具欄上,然后將它們鏈接到實現相應action功能的槽函數上。例如:

openAct = new QAction(QIcon(":/images/open.png"), tr("&Open..."), this);

openAct->setShortcuts(QKeySequence::Open);

openAct->setStatusTip(tr("Open an existing file"));

connect(openAct, SIGNAL(triggered()), this, SLOT(open()));

fileMenu->addAction(openAct);

fileToolBar->addAction(openAct);

???? 我們建議將actions作為使用它們的窗口的孩子創建。在絕大多數情況下,actions都是應用程序主窗口的孩子。

?????? 類的枚舉成員變量:

這個枚舉類型主要是在調用QAction::activate()函數的時候被使用到。我們來看看QAction::activate()函數的原型:

???????? 從上面可以看出,我們使用該函數發射信號,而參數event則指明了發射的信號類型。基于action的widgets可以自己發射信號,然而我們也可以顯式的調用本API來發射信號。

??????? 由于Mac OS X系統的一些特性,Qt 會對一些菜單項進行自動排列。比如,如果你的菜單是“關于”、“設置”、“首選項”、“退出”等等,我們可以給它們分配一個角色,Qt 則會根據這些角色對菜單項的順序作出正確的排列。方法是,設置 QAction::menuRole 屬性,例如:AboutRole、PreferencesRole、QuitRole 或者 NoRole。舉例

來說,我們可以將“設置”菜單項作為 Mac OS X 的 Application::preferences。

???????? QAction::MenuRole類型的枚舉主要描述了在Mac OS X系統上,action如何移動到應用程序的菜單上。設置這個值只對菜單上的直接菜單有效,對子菜單無效。例如:如果有一個File菜單,該File菜單又包含有子菜單,那么如果你針對子菜單設置這些值,那么這些值永遠不會起作用。

?????????? 該優先級用于表明action在用戶界面上的優先級。例如,當你的工具欄設置了Qt::ToolButtonTextBesideIcon模式,那么低優先級的actions將不會顯示出標簽。

【示例】

(1) 使用Action構造工具欄和菜單欄

MainWindow::MainWindow(QWidget *parent)

: QMainWindow(parent)

{

initMenu();

initToolBar();

}

void MainWindow::initMenu()

{

/* 初始化File菜單 */

fileMenu = new QMenu(tr("File"), this);

fileOpenAction = new QAction("&Open...", this);

fileSaveAction = new QAction("&Save...", this);

fileMenu->addAction(fileOpenAction);

fileMenu->addAction(fileSaveAction);

/* 初始化Edit菜單 */

editMenu = new QMenu("&Edit");

editCopyAction = editMenu->addAction("&Copy");

editCutAction = editMenu->addAction("&Cut");

/* 將菜單添加到菜單欄上 */

QMenuBar *menuBar = this->menuBar();

menuBar->addMenu(fileMenu);

menuBar->addMenu(editMenu);

}

void MainWindow::initToolBar()

{

/* 初始化FileToolBar */

fileToolBar = new QToolBar(this);

fileToolBar->addAction(fileOpenAction);

fileToolBar->addAction(fileSaveAction);

/* 初始化EditToolBar */

editToolBar = new QToolBar(this);

editToolBar->addAction(editCopyAction);

editToolBar->addAction(editCutAction);

/* 將工具添加到工具欄上 */

addToolBar(Qt::TopToolBarArea, fileToolBar);

addToolBar(Qt::TopToolBarArea, editToolBar);

}

MainWindow::~MainWindow()

{

}

(2)測試QAction::activate(QAction::ActionEvent)

MainWindow::MainWindow(QWidget *parent)

: QMainWindow(parent)

{

initMenu();

initToolBar();

initConnect();

}

void MainWindow::initConnect()

{

connect(fileOpenAction, SIGNAL(triggered()),

this, SLOT(sendActivate()));

connect(fileSaveAction, SIGNAL(hovered()),

this, SLOT(ansHovered()));

}

void MainWindow::sendActivate()

{

/* 這將會導致fileSaveAction發送信號QAction::hovered() */

fileSaveAction->activate(QAction::Hover);

}

void MainWindow::ansHovered()

{

qDebug("Ans!!!");

}

運行結果:

(3)測試QAction::Priority

void MainWindow::initMenu()

{

/* 初始化File菜單 */

fileMenu = new QMenu(tr("File"), this);

fileOpenAction = new QAction("&Open...", this);

fileSaveAction = new QAction("&Save...", this);

fileMenu->addAction(fileOpenAction);

fileMenu->addAction(fileSaveAction);

/* 初始化Edit菜單 */

editMenu = new QMenu("&Edit");

editCopyAction = editMenu->addAction("&Copy");

editCutAction = editMenu->addAction(QIcon(":/cut.PNG"), "&Cut");

//editCutAction->setPriority(QAction::LowPriority);

/* 將菜單添加到菜單欄上 */

QMenuBar *menuBar = this->menuBar();

menuBar->addMenu(fileMenu);

menuBar->addMenu(editMenu);

}

void MainWindow::initToolBar()

{

/* 初始化FileToolBar */

fileToolBar = new QToolBar(this);

fileToolBar->addAction(fileOpenAction);

fileToolBar->addAction(fileSaveAction);

/* 初始化EditToolBar */

editToolBar = new QToolBar(this);

editToolBar->addAction(editCopyAction);

editToolBar->addAction(editCutAction);

/* 將工具添加到工具欄上 */

addToolBar(Qt::TopToolBarArea, fileToolBar);

addToolBar(Qt::TopToolBarArea, editToolBar);

/* 設置工具欄為QT::ToolButtonTextBesideIcon */

this->setToolButtonStyle(Qt::ToolButtonTextBesideIcon);

}

此時注釋掉了設置優先級的語句,圖標和文字均能顯示出來,效果如下圖:

取消上面的注釋;

/* 初始化Edit菜單 */

editMenu = new QMenu("&Edit");

editCopyAction = editMenu->addAction("&Copy");

editCutAction = editMenu->addAction(QIcon(":/cut.PNG"), "&Cut");

editCutAction->setPriority(QAction::LowPriority);

運行效果如下:

二、QActionGroup類詳解

【詳細描述】

??????? QActionGroup類將actions分組。

?????? 在某些情況下將QAction分組是十分有用的。例如,如果你有一個Left Align的action,一個Right Align的action,一個Justify的action,

以及一個Center action,在統一時刻所有這些actions只能有一個被激活。一種簡便的做法就是將這些actions以分組的方式組織。

下面是一個示例:

alignmentGroup = new QActionGroup(this);

alignmentGroup->addAction(leftAlignAct);

alignmentGroup->addAction(rightAlignAct);

alignmentGroup->addAction(justifyAct);

alignmentGroup->addAction(centerAct);

leftAlignAct->setChecked(true);

??????? 在上面的示例中,我們創建了一個action組。由于action group默認是互斥的,因此在同一時刻只有一個會被選中。

??????? 當組內的某個action被選中的時候,QActionGroup就會發射triggered()信號。通常情況下,組內的每個action發射自己的triggered()信號。

??????? 正如上面提到的,action group默認是互斥的;它確保在同一時刻只有一個action會被選中。如果你想創建一個action group而不想時它們是互斥關系,那么你可以通過調用setExclusive(false)來關閉互斥關系。

??????? 可以使用addAction()函數將action添加到action group中,然而更常見的做法是在創建action的時候指定一個group;這確保了這些actions具有同一個父親。可以通過在group中添加分割線使得各個action分開顯示,可以使用QAction的setSeparator()添加分割線。通常使用QWidget::addActions()函數將action group添加到窗口部件上。

【示例】

/* 初始化Action菜單 */

actionMenu = new QMenu("Action");

leftAction = new QAction("Left", this);

rightAction = new QAction("Right", this);

centerAction = new QAction("Center", this);

justifyAction = new QAction("Justify", this);

actionGroup = new QActionGroup(this);

actionMenu->addAction(actionGroup->addAction(leftAction));

actionMenu->addAction(actionGroup->addAction(rightAction));

actionMenu->addAction(actionGroup->addAction(centerAction));

actionMenu->addAction(actionGroup->addAction(justifyAction));

可以使用下面的槽函數驗證默認情況下,一次只有一個action可以被選中。當然也可以設置action的

bool

isExclusive () const

為false,使得一次可以選中多個:

void MainWindow::initConnect()

{

connect(fileOpenAction, SIGNAL(triggered()),

this, SLOT(sendActivate()));

connect(fileSaveAction, SIGNAL(hovered()),

this, SLOT(ansHovered()));

connect(leftAction, SIGNAL(triggered()),

this, SLOT(ansTriggered()));

connect(rightAction, SIGNAL(triggered()),

this, SLOT(ansTriggered()));

connect(centerAction, SIGNAL(triggered()),

this, SLOT(ansTriggered()));

connect(justifyAction, SIGNAL(triggered()),

this, SLOT(ansTriggered()));

}

運行效果:

備注:

1、放置到ActionGroup中就默認是exclusive。

2、是否出現選中的標志"小圓點"是通過設置setcheckable完成的。兩者并無聯系。

關于QActionGroup的使用,我發的一個帖子中有提到,再次感謝網友jdwx1

帖子的連接如下,感興趣的可以看看QActionGroup只對子菜單生效?

三、QWidgetAction類詳解

【詳細描述】

??????? QWidgetAction通過接口方式繼承自QAction,用于將自定義的widget插入基于action的容器,例如工具欄。

??????? 出現在應用程序中的絕大多數的actions都是代表了一個菜單項或工具欄中的一個按鈕。然而有時候我們也許要復雜一點的widgets。例如,字處理程序工具欄中使用QComboBox實現zoom action,實現不同程度的縮放。QToolBar提供了QToolBar::insertWidget()函數可以十分方便的將單個widget插入到合適的位置。然而,如果你想在多個容器中實現自定義widget的action,那么你就必須實現QWidgetAction的子類。

??????? 如果QWidgetAction添加到QToolBar,那么就會調用QWidgetAction::createWidget()。我們可以重新實現這個函數創建自定義的widget。

??????? 如果將一個action從容器widget上刪除,那么就會調用QWidgetAction::deleteWidget(),調用該函數的參數就是上面創建的自定義widget。該函數的默認實現是將widget隱藏,然后使用QObject::deleteLater()刪除它。

??????? 如果你只有一個自定義的widget,那么你就可以使用setDefaultWidget()函數將它設置為默認的widget。那么以后當action被添加到QToolBar上時,就會自動將該自定義的widget添加到QToolBar上。如果將僅有一個默認widget的QWidgetAction同時添加到兩個工具欄上,那么僅有第一個添加才會顯示出來。QWidgetAction接管了默認的widget。

??????? 注意:這取決于widget激活action,例如重新實現鼠標事件處理者,然后調用QAction::trigger()。

Mac OS X:在Mac OS X上,如果你將一個widget添加到應用程序菜單欄的某個菜單上,那么該widget可以顯示出來,并且可以實現功能,只是有一些限制:

1、該widget的父對象不再是QMenu而是原生的菜單視圖。如果你在其他地方顯示菜單(例如作為一個彈出菜單),那么該菜單不會顯 示在你期望的地方;

2、針對該widget的Focus/Keyboard處理不再可用;

3、由于Apple的設計,該widget的鼠標軌跡暫時不可用;

4、將triggered()信號鏈接到打開模態對話框的槽函數上會導致應用程序崩潰(在Mac OS X10.4,這被告知是Apple的一個BUG),一個規避的方法是使用QueuedConnection代替DirecConnection。

【示例】

本示例代碼來自:http://www.qtcn.org/bbs/simple/?t28610.html

功能:設置QMenu中菜單項的高度

代碼片段:

class MyMenuItem:public QWidget

{

Q_OBJECT

public:

MyMenuItem(QWidget *parent)

{

new QLabel("test",this);

}

};

int main(int argc, char *argv[])

{

popupMenu = new QMenu(this);

QAction *action1 = new QAction(tr("&New1"), this);

QAction *action2 = new QAction(tr("&New2"), this);

QAction *action3 = new QAction(tr("&New3"), this);

QAction *action4 = new QAction(QIcon("./load.png"), tr("Bookstore"), this);

popupMenu->addAction(action1);

popupMenu->addAction(action2);

popupMenu->addAction(action3);

popupMenu->addAction(action4);

MyMenuItem *item1 = new MyMenuItem(this);

item1->setFixedSize(100,100); //這里可以設置大小

QWidgetAction *action1 = new QWidgetAction(popupMenu);

action1->setDefaultWidget(item1);

MyMenuItem *item2 = new MyMenuItem(this);

QWidgetAction *action2 = new QWidgetAction(popupMenu);

action2->setDefaultWidget(item2);

MyMenuItem *item3 = new MyMenuItem(this);

QWidgetAction *action3 = new QWidgetAction(popupMenu);

action3->setDefaultWidget(item3);

popupMenu->exec();

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/253974.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/253974.shtml
英文地址,請注明出處:http://en.pswp.cn/news/253974.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

H.264優秀特征

一、主要特性 1、H.264/AVC相對以前的編碼方法,以MPEG-2為例,在圖像內容預測方面提高編碼效率,改善圖像質量的主要特點如下: ● 可變塊大小運動補償: 選擇運動補償大小和形狀比以前的標準更靈活,最小的…

Linux 文件系統 EXT4 的前世今生

在先前關于Linux文件系統的文章中,我寫了一份說明書去介紹Linux文件系統,里面有一些高級的概念,比如說,一切都是文件。我很想去深入地討論更多EXT文件系統的特性的信息。所以,首先讓我們來回答這個問題:什么…

windows 添加開始菜單

C:\Users\用戶名(為你設置的電腦名稱)\AppData\Roaming\Microsoft\Windows\Start Menu C:\ProgramData\Microsoft\Windows\Start Menu 注:默認狀態下AppData和ProgramData文件夾為隱藏狀態,所以要查看需要先顯示隱藏的文件。 具體…

awesome-go:很全的go語言資源合集

awesome-go:一個很全的go語言框架,庫,軟件合集 前面發過關于awsone-python, awsone django, flask。最近在學習golang,所以找到awsone-go 非常贊的go語言 Audio & 音樂類安全認證 & OAuthCUI數據庫數據庫驅動日期時間Emai…

zabbix監控系列(5)之通過trap模式監控網絡設備

轉載于:https://www.cnblogs.com/liaojiafa/p/7216749.html

struts2框架下的一個簡單的ajax例子

舉個例子 jsp頁面&#xff1a; <% page language"java" import"java.util.*" pageEncoding"utf-8"%> <% String path request.getContextPath(); String basePath request.getScheme()"://"request.getServerName()":…

C語言的指針初始化特別注意一點

void func2(int *value) { *value 2; /// value為空指針&#xff0c;不能被取值&#xff0c;所以*value是錯誤的 } void func1() { int *p 0;//此處相當于PNULL func2(p); } / void func2(int *value) { *value 2; /// 正確} void func1() { int a0; int *p &…

小程序—九宮格心形拼圖

說明 前幾天在朋友圈看到好幾次這種圖片。 這種圖片&#xff0c;是用九張圖片拼成的一個心形。 感覺很有趣&#xff0c;就上網查了查怎么做&#xff0c;大部分的說法就是用美圖秀秀的拼圖功能來做&#xff0c; 在微信小程序中也有專門做心形拼圖的小程序&#xff0c;我都試了試…

第二部分:志愿錄取標準

第二部分&#xff1a;志愿錄取標準 零、概況一、傳統志愿錄取過程二、平行志愿錄取過程三、17年志愿錄取過程 零、概況自1977年&#xff0c;恢復高考以來&#xff0c;高考錄取標準&#xff0c;作為公平線&#xff0c;都是相當透明的。這部分分享&#xff0c;以錄取標準&#xf…

100. Same Tree

Given two binary trees, write a function to check if they are equal or not. Two binary trees are considered equal if they are structurally identical and the nodes have the same value. 遞歸遍歷左子樹和右子樹 /*** Definition for a binary tree node.* struct T…

關于RTP時間戳及多媒體通信同步的問題/H264關于RTP協議的實現

http://www.rosoo.net/a/201101/10776.html http://hi.baidu.com/fairygardenjoy/blog/item/e56c5cca95829e37b600c88e.html H264關于RTP協議的實現:http://www.rosoo.net/a/201108/14896.html RTP協議包頭的格式&#xff1a; 10~16 Bit為PT域&#xff0c;指的就是負載類型…

程序員懂點經濟學-股票投資

2019獨角獸企業重金招聘Python工程師標準>>> ▍寫在前面 前面有文章 關于程序員如何賺點小錢 講過 合理的投資理財&#xff0c;可以了解一下. 再次建議&#xff0c;不要將全身家當投入股市&#xff0c;建議投入10~30%就好了. (不要拿輸不起的錢來炒股&#xff0c;比…

徹底弄懂響應式設計中的em和rem

前一陣子在響應式開發中遇到了em和rem的問題&#xff0c;也上網搜過一些文章&#xff0c;篇幅很長&#xff0c;也沒有仔細看&#xff0c;今天來總結一下。 rem是指&#xff1a;根元素&#xff08;root element&#xff0c;html&#xff09;的字體大小&#xff0c; em是指&#…

JAVA字符串

字符串 1. 字符串 1.1 字符串概述和特點 java.lang.String類代表字符串。 API當中說&#xff1a;Java 程序中的所有字符串字面值&#xff08;如 "abc" &#xff09;都作為此類的實例實現。 其實就是說&#xff1a;程序當中所有的雙引號字符串&#xff0c;都是String類…

21分鐘 MySQL 入門教程

轉自 21分鐘 MySQL 入門教程 一、MySQL的相關概念介紹二、Windows下MySQL的配置配置步驟MySQL服務的啟動、停止與卸載三、MySQL腳本的基本組成四、MySQL中的數據類型五、使用MySQL數據庫登錄到MySQL創建一個數據庫選擇所要操作的數據庫創建數據庫表六、操作MySQL數據庫向表中插…

node-sass報錯解決方法

node-sass報錯解決方法 node-sass報錯解決方法 在Vue.js中&#xff0c;每一個vue文件都是一個組件&#xff0c;在.vue文件中可以將模板&#xff0c;腳本&#xff0c;樣式寫在一起&#xff0c;便于組織整個組件。在使用template&#xff0c;script時&#xff0c;編寫css樣式時&a…

微軟人工智能愿景:根植于研發 寄望于“對話”

過去25年來&#xff0c;微軟公司持續投入人工智能的發展愿景。現在&#xff0c;借助全新發布的聊天機器人Zo、Cortana Decices SDK和智能套件、以及擴展智能工具&#xff0c;這一愿景即將成為現實。12月13日&#xff0c;在舊金山的一次小聚會上&#xff0c;微軟全球執行副總裁、…

H264 TS/ES

http://blog.csdn.net/heanyu/article/details/6229724

Java中Semaphore(信號量) 數據庫連接池

計數信號量用來控制同時訪問某個特定資源的操作數或同時執行某個指定操作的數量 A counting semaphore.Conceptually, a semaphore maintains a set of permits. Each acquire blocks if necessary until a permit is available, and then takes it. Each release adds a permi…