翻譯|使用教程|編輯:龔雪|2024-09-27 10:22:17.097|閱讀 111 次
概述:本文主要介紹如何在在Qt應用程序中使用Wacom平板電腦,歡迎下載最新版組件體驗~
# 界面/圖表報表/文檔/IDE等千款熱門軟控件火熱銷售中 >>
相關鏈接:
Qt 是目前最先進、最完整的跨平臺C++開發工具。它不僅完全實現了一次編寫,所有平臺無差別運行,更提供了幾乎所有開發過程中需要用到的工具。如今,Qt已被運用于超過70個行業、數千家企業,支持數百萬設備及應用。
當您在平板電腦上使用Qt應用程序時, s就會生成。如果您想處理tablet事件,需要重新實現tabletEvent()事件處理程序。當用于繪圖的工具(觸控筆)進入并離開寫字板附近時(即,當它關閉但未按下時),當工具被按下并從中釋放時,當工具在寫字板上移動時,以及當工具上的一個按鈕被按下或釋放時,都會產生事件。
中可用的信息取決于所使用的設備,本實例可以處理多達三種不同繪圖工具的平板電腦:觸控筆、噴槍和藝術筆。對于這些事件,將包含工具的位置,平板電腦上的壓力、按鈕狀態、垂直傾斜和水平傾斜(即設備與平板電腦垂直方向之間的角度,如果平板電腦硬件可以提供)。噴槍有指輪,這個位置也可以在平板電腦事件中找到;藝術筆提供圍繞垂直于平板表面的軸旋轉,因此它可以用于書法。
在這個例子中,我們實現了一個繪圖程序。您可以用觸控筆在平板電腦上畫畫,就像在紙上用鉛筆一樣。當用噴槍畫畫時,會得到一種虛擬的油漆噴霧,手指輪用來改變噴霧的密度。當您用美術筆繪制時,會得到一條線,它的寬度和端點角度取決于筆的旋轉,壓力和傾斜也可以被分配來改變顏色的alpha和飽和度值以及筆畫的寬度。
本示例包括以下內容:
Qt技術交流群:166830288 歡迎一起進群討論
MainWindow創建一個TabletCanvas,并將其設置為中心小部件。
class MainWindow : public QMainWindow { Q_OBJECT public: MainWindow(TabletCanvas *canvas); private slots: void setBrushColor(); void setAlphaValuator(QAction *action); void setLineWidthValuator(QAction *action); void setSaturationValuator(QAction *action); void setEventCompression(bool compress); bool save(); void load(); void clear(); void about(); private: void createMenus(); TabletCanvas *m_canvas; QColorDialog *m_colorDialog = nullptr; };
createMenus()用操作設置菜單,我們有一個QActionGroup用于分別改變alpha通道、顏色飽和度和線寬的操作。操作組連接到setAlphaValuator()、setSaturationValuator()和setLineWidthValuator()插槽,它們調用TabletCanvas中的函數。
我們從構造函數MainWindow()開始:
MainWindow::MainWindow(TabletCanvas *canvas) : m_canvas(canvas) { createMenus(); setWindowTitle(tr("Tablet Example")); setCentralWidget(m_canvas); QCoreApplication::setAttribute(Qt::AA_CompressHighFrequencyEvents); } 在構造函數中,我們調用createMenus()來創建所有的操作和菜單,并將畫布設置為中心小部件。 MainWindow::MainWindow(TabletCanvas *canvas) : m_canvas(canvas) { createMenus(); setWindowTitle(tr("Tablet Example")); setCentralWidget(m_canvas); QCoreApplication::setAttribute(Qt::AA_CompressHighFrequencyEvents); }
在createMenus()的開頭,我們填充了File菜單。使用在Qt 5.6中引入的()的重載來創建帶有快捷方式(也可以是圖標)的菜單項,將其添加到菜單中,并將其連接到插槽,所有這些都只需要一行代碼,使用QKeySequence為這些常用菜單項獲取特定于平臺的標準快捷鍵。
我們還填充了畫筆菜單,更改筆刷的命令通常沒有標準的快捷方式,因此使用tr()來翻譯快捷方式以及應用程序的語言翻譯。
現在,我們將在Tablet菜單的子菜單中創建一組互斥操作,用于選擇每個 QMenu *alphaChannelMenu = tabletMenu->addMenu(tr("&Alpha Channel"));
QAction *alphaChannelPressureAction = alphaChannelMenu->addAction(tr("&Pressure")); alphaChannelPressureAction->setData(TabletCanvas::PressureValuator); alphaChannelPressureAction->setCheckable(true); QAction *alphaChannelTangentialPressureAction = alphaChannelMenu->addAction(tr("T&angential Pressure")); alphaChannelTangentialPressureAction->setData(TabletCanvas::TangentialPressureValuator); alphaChannelTangentialPressureAction->setCheckable(true); alphaChannelTangentialPressureAction->setChecked(true); QAction *alphaChannelTiltAction = alphaChannelMenu->addAction(tr("&Tilt")); alphaChannelTiltAction->setData(TabletCanvas::TiltValuator); alphaChannelTiltAction->setCheckable(true); QAction *noAlphaChannelAction = alphaChannelMenu->addAction(tr("No Alpha Channel")); noAlphaChannelAction->setData(TabletCanvas::NoValuator); noAlphaChannelAction->setCheckable(true); QActionGroup *alphaChannelGroup = new QActionGroup(this); alphaChannelGroup->addAction(alphaChannelPressureAction); alphaChannelGroup->addAction(alphaChannelTangentialPressureAction); alphaChannelGroup->addAction(alphaChannelTiltAction); alphaChannelGroup->addAction(noAlphaChannelAction); connect(alphaChannelGroup, &QActionGroup::triggered, this, &MainWindow::setAlphaValuator);
我們希望用戶能夠選擇繪畫顏色的alpha分量是否應該通過平板壓力、傾斜或噴槍工具上拇指輪的位置來調節。對每個選擇都有一個操作,另外一個操作是選擇不改變alpha,也就是說,保持顏色不透明。我們讓操作可檢查,然后alphaChannelGroup將確保在任何時候只檢查一個操作。當一個操作被檢查時,triggered()信號從組中發出,因此我們將其連接到MainWindow::setAlphaValuator(),它將需要知道從現在開始關注的哪個屬性(估值器),因此使用屬性來傳遞此信息。(為了實現這一點,枚舉Valuator必須是一個注冊元類型,以便它可以插入到中。這是通過tabletcanvas.h中的Q_ENUM聲明完成的。)
下面是setAlphaValuator()的實現:
void MainWindow::setAlphaValuator(QAction *action) { m_canvas->setAlphaChannelValuator(qvariant_cast<TabletCanvas::Valuator>(action->data())); }
它只需要從()中檢索Valuator枚舉,并將其傳遞給tablecanvas::setAlphaChannelValuator()。如果不使用data屬性,則需要比較指針本身,例如在switch語句中。但這需要在類變量中保留指向每個的指針,以便進行比較。
下面是setBrushColor()的實現:
void MainWindow::setBrushColor() { if (!m_colorDialog) { m_colorDialog = new QColorDialog(this); m_colorDialog->setModal(false); m_colorDialog->setCurrentColor(m_canvas->color()); connect(m_colorDialog, &QColorDialog::colorSelected, m_canvas, &TabletCanvas::setColor); } m_colorDialog->setVisible(true); }
我們在用戶第一次選擇畫筆顏色時延遲初始化QColorDialog,從菜單或通過操作快捷方式。當對話框打開時,每次用戶選擇不同的顏色時,TabletCanvas::setColor()將被調用來更改繪圖顏色。因為它是一個非模態對話框,所以用戶可以自由地讓顏色對話框保持打開狀態,以便能夠方便而頻繁地更改顏色,或者關閉它并稍后重新打開它。
下面是save()的實現:
bool MainWindow::save() { QString path = QDir::currentPath() + "/untitled.png"; QString fileName = QFileDialog::getSaveFileName(this, tr("Save Picture"), path); bool success = m_canvas->saveImage(fileName); if (!success) QMessageBox::information(this, "Error Saving Picture", "Could not save the image"); return success; }
我們使用QFileDialog讓用戶選擇一個文件來保存繪圖,然后調用TabletCanvas::saveImage()將其實際寫入文件。
下面是load()的實現:
void MainWindow::load() { QString fileName = QFileDialog::getOpenFileName(this, tr("Open Picture"), QDir::currentPath()); if (!m_canvas->loadImage(fileName)) QMessageBox::information(this, "Error Opening Picture", "Could not open picture"); }
我們讓用戶選擇要用QFileDialog打開的圖像文件,然后要求畫布使用loadImage()加載圖像。
下面是about()的實現:
void MainWindow::about() { QMessageBox::about(this, tr("About Tablet Example"), tr("This example shows how to use a graphics drawing tablet in Qt.")); }
我們將顯示一個消息框,其中包含對示例的簡短描述。
本站文章除注明轉載外,均為本站原創或翻譯。歡迎任何形式的轉載,但請務必注明出處、不得修改原文相關鏈接,如果存在內容上的異議請郵件反饋至chenjj@fc6vip.cn
文章轉載自:慧都網