QT 슬롯 함수 신호 전송 객체 가져오기
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 *obj = new QTimer;
QTimer *timer = qobject_cast(obj);
1개#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
}
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에 업로드됨
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.