Russian Qt Forum

Qt => Общие вопросы => Тема начата: demaker от Март 14, 2018, 10:47



Название: указатели на функцию
Отправлено: demaker от Март 14, 2018, 10:47
Скажите возможна ли такая работа с указателями на функцию в классе

Код
C++ (Qt)
class MainWindow : publc QMainWindow
{
 
      Q_OBJECT
 
public:
     MainWindow();
     virtual~MainWindow();
 
private slots:
     void clickedPbFunc1();
     void clickedPbFunc2();
 
private:
    void Operation(void (MainWindow::*funcPtr)());
    void Func1();
    void Func2();
}
 

Код
C++ (Qt)
 
void MainWindow::Operation(void (MainWindow::*funcPtr)())
{
    SmthClass *smth = new SmthClass;
    connect(smth, &SmthClass::smth_signal, this, funcPtr);
}
 
void MainWindow::clickedPbFunc1()
{
      Operation(&MainWindow::Func1);
}
 
void MainWindow::clickedPbFunc2()
{
      Operation(&MainWindow::Func2);
}
 
 


Название: Re: указатели на функцию
Отправлено: __Heaven__ от Март 14, 2018, 14:24
Имхо, возможна. Но выглядит неприятно.
Можно попробовать улучшить вид.
Код
C++ (Qt)
void MainWindow::clickedPbFunc() {
   /*static*/ const std::map<QObject, void (MainWindow::*funcPtr)()> funMap = {
       {pb1, &MainWindow::Func1}
   };
 
   SmthClass *smth = new SmthClass;
   connect(smth, &SmthClass::smth_signal, this, funMap.at(sender()));
}


Название: Re: указатели на функцию
Отправлено: kambala от Март 14, 2018, 17:55
Имхо, возможна. Но выглядит неприятно.
Можно попробовать улучшить вид.
Код
C++ (Qt)
void MainWindow::clickedPbFunc() {
   /*static*/ const std::map<QObject, void (MainWindow::*funcPtr)()> funMap = {
       {pb1, &MainWindow::Func1}
   };
 
   SmthClass *smth = new SmthClass;
   connect(smth, &SmthClass::smth_signal, this, funMap.at(sender()));
}
не очень понятно при чем тут QObject — использовать указатели на методы можно и в не-Qt классах


Название: Re: указатели на функцию
Отправлено: __Heaven__ от Март 14, 2018, 21:19
kambala, я понял, что ТС хочет по нажатию на разные кнопки создавать объект и соединять его сигнал со слотом окна, а нужный слот выбирается в зависимости от нажатой кнопки.