2011-07-15 252 views
2

我是Qt GUI編程的新手,在GUI開發過程中來自.NET/Winforms背景。我正在使用Qt Creator IDE。Qt中的事件處理

我該如何處理按下按鈕事件Qt中做類似如下:

if (button.clicked = true) 
{ 
    startProgram(); 
} 

此外,如何將我瀏覽一個配置文件,該文件將填充值到我所有的行編輯文本框時打開?我正在用C++進行編程。

編輯:我正在拍攝其他人編寫的控制檯應用程序,並在其周圍構建GUI。我想通過按鈕點擊事件來訪問其中的一個功能。但是,我無法弄清楚如何讓原始應用程序的功能在我嘗試使用SIGNALS和SLOTS時創建的GUI範圍內。

+1

我建議你遵循Qt的教程在http://doc.qt.nokia.com/latest/tutorials.html –

+0

你打算使用QML,還是UI設計師?這有很大的不同。 – kmdent

+0

@kmdent - 我正在使用UI設計器。 –

回答

1

爲了訪問控制檯應用程序中定義的函數,需要包含聲明這些函數的頭文件(.h/.hpp),並鏈接它們的實現。我有實現的源代碼(.cpp),您需要將它們添加到要編譯的源文件中(它們將被編譯爲將在最終可執行文件中鏈接的目標文件(.o))。如果控制檯應用程序是庫中定義的一組函數的前端(.lib,.a),則需要鏈接此庫。

之後,您可以使用Qt的信號/插槽機制將「按鈕已點擊」信號連接到調用您要執行的函數的插槽,如其他答案中所述。

6

解釋起來有點長,但是您可以使用該功能將按鈕信號連接到插槽。

connect(button, SIGNAL(triggered()), this, SLOT(doSomething())); 

你真的需要閱讀並嘗試寫代碼

編輯之前瞭解signals and slots:您正在試圖調用函數在編譯的獨立運行的程序?
您是否將Qt Signals與C/Unix信號混淆?你可以從你的Qt應用程序中啓動單獨的應用程序,獲得它的PID,然後發送一個'c'信號。

或者,如果你有應用程序的源代碼,你可以將它的代碼包含到你的Qt應用程序中,然後通過簡單地用Qt插槽處理程序包裝它們來調用任何函數。

+0

我已經嘗試了這種方法,但是我似乎沒有任何訪問我希望在點擊按鈕時觸發的功能。我在原始問題中增加了更多細節。 –

15

一個簡單的例子可能是這樣的。假設你有一個像ProgramStarter類:

#include <QObject> 

class ProgramStarter : public QObject { 

    Q_OBJECT 

public slots: 

    void startProgram() { 
     //Do stuff 
    } 

}; 

和像這樣使用ProgramStarter其中:

#include <QtGui/QApplication> 
#include <QPushButton> 
#include <QObject> 

#include "programstarter.h" 

int main(int argc, char *argv[]) 
{ 
    QApplication app(argc, argv); 
    QPushButton *testButton = new QPushButton("Push me"); 
    testButton->resize(100, 40); 
    testButton->show(); 

    ProgramStarter *program = new ProgramStarter; 

    QObject::connect(testButton, SIGNAL(clicked()), program, SLOT(startProgram())); 

    return app.exec(); 
} 

Qt使用信號和槽對象之間的通信。核心思想是當事件發生時發出信號,並且這些信號可以連接到插槽。在這種情況下,當按下按鈕並且clicked()信號連接到startProgram()插槽時,該按鈕發出clicked()信號。所以當按下按鈕時,startProgram()被調用。

Qt有一個元對象系統,用於啓用信號和插槽等。這就是爲什麼ProgramStarter繼承QObject以及爲什麼Q_OBJECT宏位於標題中的原因。如果你想了解信號和插槽以及元對象系統如何在Qt中工作,我強烈建議閱讀本文:http://doc.qt.io/qt-5/signalsandslots.html

+0

感謝您的回覆,但是我似乎無法從我的GUI訪問我需要的任何功能。請參閱我已添加到我的原始問題中的其他詳細信息。 –

0

如果您有使用Designer創建的按鈕,則可以在父窗口小部件類中使用on_myButton_clicked()插槽,就像在WinForms中一樣。

1

看來你的問題並不是真的與Qt或GUI編程有關,而是一個普遍的設計問題。其他人已經告訴你如何按下按鈕時得到通知 - 取決於你想要調用的任何代碼,取決於你的通知。一些可能性:

  • 如果你只是需要調用一個函數,然後包含適當的頭文件並調用它。
  • 如果您有一個對象需要調用方法,那麼您需要爲接收該通知的類提供對該對象的引用。
  • 如果您的控制檯應用程序是一個單獨的程序,您可以使用QProcess啓動並與之通信。
1

我想你的問題是,你不能調用控制檯應用程序的功能,因爲它沒有被定義爲一個插槽。所以這裏是你如何做到的。

讓我們假設你有一個控制檯應用程序類,它可能是這樣的:

class ConsoleApp 
{ 
public: 
    void run() 
    { 
     // Code which you want to trigger by a button in your UI. 
    } 
} 

然後,我們實現一個基於Qt的包裝類從QObject的類繼承,因此,能夠發送和接收信號。該類僅提供一個將執行委託給ConsoleApp類的自定義槽。

class ConsoleAppWrapper : public QObject 
{ 
    Q_OBJECT 

public slots: 
    void startProgram() 
    { 
     m_consoleApp.run(); 
    } 

private: 
    ConsoleApp m_consoleApp; 
} 

好吧,現在我們需要一個按鈕,當按下按鈕時,它將觸發'run()'方法的調用。

int main(int argc, const char** argv) 
{ 
    QApplication app(argc, argv); 

    // Define wrapper for console app. 
    ConsoleAppWrapper wrapper; 

    // Define button and connect its 'clicked()' signal 
    // to the wrapper's 'startProgram()' slot. 
    QPushButton startProgramButton("Start Program"); 
    connect(&startProgramButton, SIGNAL(clicked()), &wrapper, SLOT(startProgram())); 

    // Show the button. 
    startProgramButton.setVisible(true); 

    // Start Qt's event loop. 
    app.exec(); 
} 

這應該給你一個'Start Program'按鈕,當按下它時,它將調用ConsoleApp :: run()方法。

雖然這個例子不是基於Qt設計器,但我希望這個例子可以幫助您理解Qt中的信號和插槽是如何工作的。

乾杯, 強尼