日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問(wèn)題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營(yíng)銷解決方案
「Qt與Linux聯(lián)動(dòng),如何實(shí)現(xiàn)右鍵關(guān)閉事件」(qtlinux右鍵關(guān)閉事件)

Qt與Linux聯(lián)動(dòng),如何實(shí)現(xiàn)右鍵關(guān)閉事件

Qt是一個(gè)跨平臺(tái)的圖形用戶界面應(yīng)用程序開(kāi)發(fā)框架,它可以為不同的操作系統(tǒng)提供相同的程序界面,因此在Linux系統(tǒng)中使用Qt來(lái)開(kāi)發(fā)GUI程序是非常常見(jiàn)的。

但是,在使用Qt開(kāi)發(fā)Linux GUI程序時(shí),有時(shí)需要實(shí)現(xiàn)一些特定的功能,例如在右鍵點(diǎn)擊窗口關(guān)閉按鈕時(shí),程序能夠?qū)崿F(xiàn)自動(dòng)關(guān)閉的功能。實(shí)現(xiàn)這樣的功能需要借助于Linux的一些特性和Qt的一些函數(shù)庫(kù)。

本文將介紹如何使用Qt與Linux聯(lián)動(dòng),實(shí)現(xiàn)右鍵關(guān)閉事件功能。

1.使用Linux系統(tǒng)信號(hào)

Linux系統(tǒng)的signal信號(hào)可以用來(lái)捕獲系統(tǒng)或者進(jìn)程的一些事件,例如程序的結(jié)束或者收到某些信號(hào)等。

在Linux中,使用signal可以注冊(cè)一個(gè)信號(hào)處理函數(shù),在程序接收到相應(yīng)的信號(hào)時(shí),該函數(shù)將會(huì)在程序中被調(diào)用。

因此,在使用Qt開(kāi)發(fā)Linux GUI程序時(shí),可以在程序中注冊(cè)SIGINT或者SIGTERM等Linux系統(tǒng)信號(hào),當(dāng)接收到該信號(hào)時(shí),進(jìn)行關(guān)閉程序的操作。

下面是一個(gè)簡(jiǎn)單的示例代碼:

“`

#include

#include

#include

void signalHandler(int signum)

{

// 關(guān)閉程序

QApplication::exit(0);

}

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

{

// 注冊(cè)SIGTERM信號(hào)處理函數(shù)

signal(SIGTERM, signalHandler);

QApplication app(argc, argv);

QWidget *window = new QWidget();

window->show();

return app.exec();

}

“`

上述代碼中,我們注冊(cè)了SIGTERM信號(hào)的處理函數(shù)signalHandler,當(dāng)程序接收到該信號(hào)時(shí),調(diào)用signalHandler函數(shù)關(guān)閉程序。

在Qt中也提供了類似的方法QCoreApplication::exit(int returnCode),可以直接結(jié)束程序,所以上述代碼中,我們也可以直接在signalHandler函數(shù)中調(diào)用QApplication::exit(0)函數(shù),實(shí)現(xiàn)關(guān)閉程序的功能。

2.重寫(xiě)closeEvent函數(shù)

除了使用Linux系統(tǒng)信號(hào),我們還可以在Qt程序中重寫(xiě)closeEvent函數(shù)來(lái)實(shí)現(xiàn)右鍵關(guān)閉事件的功能。

closeEvent函數(shù)是一個(gè)在程序關(guān)閉事件發(fā)生時(shí)會(huì)被調(diào)用的函數(shù),我們可以重寫(xiě)它來(lái)實(shí)現(xiàn)自定義的關(guān)閉事件處理。

下面是一個(gè)簡(jiǎn)單的示例代碼:

“`

#include

#include

#include

#include

class MyWidget : public QWidget

{

public:

MyWidget(QWidget *parent = nullptr) : QWidget(parent) {}

protected:

// 重寫(xiě)關(guān)閉事件處理函數(shù)

void closeEvent(QCloseEvent *event)

{

QMessageBox::StandardButton reply;

// 彈出關(guān)閉確認(rèn)對(duì)話框

reply = QMessageBox::question(this, “Quit”, “Are you sure you want to quit?”, QMessageBox::Yes|QMessageBox::No);

// 如果點(diǎn)擊確認(rèn),則關(guān)閉程序

if (reply == QMessageBox::Yes) {

event->accept();

} else {

event->ignore();

}

}

};

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

{

QApplication app(argc, argv);

MyWidget window;

window.setGeometry(0, 0, 400, 300);

window.show();

return app.exec();

}

“`

上述代碼中,我們繼承了QWidget類,重寫(xiě)了其中的closeEvent函數(shù),在函數(shù)中實(shí)現(xiàn)了右鍵關(guān)閉事件的功能。

在程序關(guān)閉時(shí),closeEvent函數(shù)將會(huì)被自動(dòng)調(diào)用,彈出一個(gè)確認(rèn)對(duì)話框詢問(wèn)用戶是否確認(rèn)關(guān)閉程序,如果確認(rèn)則程序?qū)㈥P(guān)閉,否則程序?qū)⒗^續(xù)運(yùn)行。

本文介紹了如何使用Qt與Linux聯(lián)動(dòng),實(shí)現(xiàn)右鍵關(guān)閉事件的功能。通過(guò)使用Linux系統(tǒng)的signal信號(hào)或者重寫(xiě)Qt程序中的closeEvent函數(shù),實(shí)現(xiàn)了在右鍵點(diǎn)擊窗口關(guān)閉按鈕時(shí),程序能夠自動(dòng)關(guān)閉的功能。

相關(guān)問(wèn)題拓展閱讀:

  • QT事件循環(huán)

QT事件循環(huán)

Qt的事件是windows的底層消息封裝而成的。這個(gè)消息和MFC里的消息是同一概念,都是指鍵盤(pán)、鼠標(biāo)等的按壓、松開(kāi)等消息。例如按下鍵盤(pán)后,windows系統(tǒng)會(huì)發(fā)出一個(gè) WM_KEYDOWN的消息,Qt捕獲這個(gè)消息后,將其轉(zhuǎn)換成 Qt::Key_Down 事件。

Qt的事件是較為底層的概念。先有事件,然后才有信號(hào)。即:消息 -> 事件 -> 信號(hào)

總結(jié):windows發(fā)出消息,Qt捕獲消息后轉(zhuǎn)換成事件,再由事件處理后發(fā)出信號(hào)。

一般來(lái)說(shuō),如果僅僅是使用Qt的控件,那么只需關(guān)心這個(gè)控件能發(fā)出什么信號(hào),但如果需要深一層的定制控件,則需要關(guān)心事件,并重寫(xiě)事件處理函數(shù)。

QThread中run()的默認(rèn)實(shí)現(xiàn)調(diào)用了exec(),從而創(chuàng)建一個(gè)QEventLoop對(duì)象,由QEventLoop對(duì)象處理線程中事件隊(duì)列(每一個(gè)線程都有一個(gè)屬于自己的事件隊(duì)列)中的事件。exec()在其內(nèi)部不斷做著循環(huán)遍歷事件隊(duì)列的工作,調(diào)用QThread的quit()或exit()方法使退出線程,盡量不要使用terminate()退出線程,terminate()退出線程過(guò)于粗暴,造成資源不能釋放,甚至互斥鎖還處于加鎖狀態(tài)。

線程中的事件循環(huán),使得線程可以使用讓轎那些需要事件循環(huán)的非GUI 類(如,QTimer,QTcpSocket,QProcess)。

在QApplication前創(chuàng)建的對(duì)象,QObject::thread()返回NULL,意味著主線程僅為這些對(duì)象處理投遞事件,不會(huì)為沒(méi)有所屬線程的對(duì)象處理另外的事件??梢杂肣Object::moveToThread()來(lái)改變對(duì)象及其子對(duì)象的線程親緣關(guān)系,假如對(duì)象有父親,不能移動(dòng)這種關(guān)系。在另一個(gè)線程(而不是創(chuàng)建它的線程)中delete QObject對(duì)象是不安全的。除非可以保證在同一時(shí)刻對(duì)象不在處理事件??梢杂肣Object::deleteLater(),它會(huì)投遞一個(gè)DeferredDelete事件,這會(huì)被對(duì)象線程的事件循環(huán)最終選取到。假如沒(méi)有事件循環(huán)運(yùn)行,事件不會(huì)分發(fā)給對(duì)象。假如在一個(gè)線程中創(chuàng)建了一個(gè)QTimer對(duì)象,但從沒(méi)有調(diào)用過(guò)exec(),那么QTimer就不會(huì)發(fā)射它的timeout()信號(hào),deleteLater()也不會(huì)工作??梢允止な褂镁€程安全的函數(shù)QCoreApplication::postEvent(),在任何時(shí)候,給任何線程中的任何對(duì)象投遞一個(gè)事件,事件會(huì)在那個(gè)創(chuàng)建了對(duì)象的線程中通過(guò)事件循環(huán)派發(fā)。事件過(guò)濾器在所有線程中也被支持,不過(guò)它限定被監(jiān)視對(duì)象與監(jiān)視對(duì)象生存在同一線程中。QCoreApplication::sendEvent(不是postEvent()),僅用于在調(diào)用此函數(shù)的線程中向目標(biāo)對(duì)象投遞事件。

所有界面組件的創(chuàng)建只能在GUI線程(主線程)中完成。子線程與界面組件的通信有兩種方式:

A、信號(hào)槽方式

B、發(fā)送自定事件方運(yùn)滑羨式

直觀的看,因?yàn)樵谥骶€程里面運(yùn)行的app->exec(),所以這樣次線程里面的ui無(wú)法接受到系統(tǒng)事件。

對(duì)Qt而言,一個(gè)進(jìn)程里和窗口系統(tǒng)(譬如Win32的GDI, linux下的X11)UI事件關(guān)聯(lián)的只有主UI線程,而并沒(méi)有設(shè)計(jì)成多線程和系統(tǒng)窗口系統(tǒng)同時(shí)交互(復(fù)雜性,安全性,性能等原因),這應(yīng)該是根源。旁拍

關(guān)于qtlinux右鍵關(guān)閉事件的介紹到此就結(jié)束了,不知道你從中找到你需要的信息了嗎 ?如果你還想了解更多這方面的信息,記得收藏關(guān)注本站。

香港服務(wù)器選創(chuàng)新互聯(lián),2H2G首月10元開(kāi)通。
創(chuàng)新互聯(lián)(www.cdcxhl.com)互聯(lián)網(wǎng)服務(wù)提供商,擁有超過(guò)10年的服務(wù)器租用、服務(wù)器托管、云服務(wù)器、虛擬主機(jī)、網(wǎng)站系統(tǒng)開(kāi)發(fā)經(jīng)驗(yàn)。專業(yè)提供云主機(jī)、虛擬主機(jī)、域名注冊(cè)、VPS主機(jī)、云服務(wù)器、香港云服務(wù)器、免備案服務(wù)器等。


分享題目:「Qt與Linux聯(lián)動(dòng),如何實(shí)現(xiàn)右鍵關(guān)閉事件」(qtlinux右鍵關(guān)閉事件)
路徑分享:http://m.5511xx.com/article/cdhscji.html