QT 슬롯 함수 신호 전송 객체 가져오기

4150 단어

Qt 슬롯 함수에서 신호 전송 객체 가져오기


Qt에서 함수 qobject 제공cast(QObject *object), 이 함수를 통해 신호가 보내는 대상을 판단할 수 있습니다
Qt 도움말 설명서: Returns the given object cast to type T if the object is of type T(or of a subclass);otherwise returns nullptr. If object is nullptr then it will also return nullptr. The class T must inherit (directly or indirectly) QObject and be declared with the Q_OBJECT macro. A class is considered to inherit itself. The qobject_cast() function behaves similarly to the standard C++ dynamic_cast(), with the advantages that it doesn't require RTTI support and it works across dynamic library boundaries.
  • 간단하게 말하면 이 함수를 사용하면 변형된 실례를 얻을 수 있지만, 이 클래스는 QObject 또는 그 하위 클래스를 계승하고 Q 를 성명해야 한다.OBJECT 이 매크로
  • QT 도움말의 Example
    QObject *obj = new QTimer; 
    QTimer *timer = qobject_cast(obj);
    
    1개
  • 여기에 RTTI와 RAII를 기록해 봅시다. RAII는 보통 대상 자원 관리에 응용되고 RTTI는 대상 유형을 동태적으로 판단할 수 있지만 RTTI를 사용하면 프로그램의 운행 시간을 증가시킬 수 있습니다. 여기에 간단하게 기록하여 구분해 봅시다.
  • RTTI : Run-time type information
    #include 
    #include 
    
    class Base {
    public:
        virtual ~Base() = default;
    };
    
    class Derived : public Base {};
    
    int main() {
        Base base;
        Derived derived;
        Base* ptr = &derived;
        Base& ref = derived;
        std::cout << typeid(base).name()<< std::endl;  // class Base 
        std::cout << typeid(derived).name()<< std::endl;  // class Derived
        std::cout << typeid(ptr).name()<< std::endl;  // class Base *
        std::cout << typeid(*ptr).name() << std::endl;  //class Derived           
        std::cout << typeid(ref).name() << std::endl;  //class Derived
    
    }
    
  • RAII : Resource Acquisition Is Initialization
         https://en.cppreference.com/w/cpp/language/raii
    std::mutex m;
    
    void bad() 
    {
        m.lock();                    // acquire the mutex
        f();                         // if f() throws an exception, the mutex is never released
        if(!everything_ok()) return; // early return, the mutex is never released
        m.unlock();                  // if bad() reaches this statement, the mutex is released
    }
    
    void good()
    {
        std::lock_guard<:mutex> lk(m); // RAII class: mutex acquisition is initialization
        f();                               // if f() throws an exception, the mutex is released
        if(!everything_ok()) return;       // early return, the mutex is released
    }
    

  • 다음은 QT 통과 qobjectcast는 신호 발송 대상의 데모를 가져옵니다. Qt Desinger를 통해 두 개의 단추와 텍스트 상자를 그리고 두 개의 단추의 클릭 이벤트를 같은 슬롯 함수에 연결합니다. 슬롯 함수에서 신호의 발송자를 판단하고 서로 다른 응답을 하는 주요 코드는 다음과 같습니다.
    #ifndef MAINWINDOW_H
    #define MAINWINDOW_H
    
    #include 
    
    QT_BEGIN_NAMESPACE
    namespace Ui { class MainWindow; }
    QT_END_NAMESPACE
    
    class MainWindow : public QMainWindow
    {
        Q_OBJECT
    
    public:
        MainWindow(QWidget *parent = nullptr);
        ~MainWindow();
    
    public slots:
        void onButtonClicked();
    
    private:
        Ui::MainWindow *ui;
    };
    #endif // MAINWINDOW_H
    
    
    #include "mainwindow.h"
    #include "ui_mainwindow.h"
    #include
    MainWindow::MainWindow(QWidget *parent)
        : QMainWindow(parent)
        , ui(new Ui::MainWindow)
    {
        ui->setupUi(this);
        connect(ui->leftButton,&QPushButton::clicked,this,&MainWindow::onButtonClicked);
        connect(ui->rightButton,&QPushButton::clicked,this,&MainWindow::onButtonClicked);
    
    }
    
    MainWindow::~MainWindow()
    {
        delete ui;
    }
    
    void MainWindow::onButtonClicked()
    {
        QPushButton *button =  qobject_cast(sender());
    
        ui->textLabel->setText(button->text());
    
        if(ui->leftButton == button)
        {
            qDebug()<textLabel->setStyleSheet("background-color:yellow");
            button->setStyleSheet("background-color:yellow");
    
        }
        else
        {
            ui->textLabel->setStyleSheet("background-color:green");
            button->setStyleSheet("background-color:green");
        }
    
    }
    
    
    

    전체 코드가 Github에 업로드됨

    좋은 웹페이지 즐겨찾기