Class Main{ public slots: virtual void add() = 0;}Class A : public Main{ public slots: void add() {cout << "A";}}Class B : public Main{ public slots: void add() {cout << "B";}}MainWindow::MainWindow(QWidget *parent){ A *a = new A(); B *b = new B(); Main *main = a; // connect пишется после инициализации main, иначе это критическая ошибка. connect(sender, SIGNAL(signal()), main, SLOT(add())); emit sender->signal(); main = b; emit sender->signal();}
C++ (Qt)#include <iostream>#include <functional> struct base { virtual ~base() {} virtual void print() = 0;}; struct derived1 : public base { virtual void print() { std::cout << "A" << std::endl; }}; struct derived2 : public base { virtual void print() { std::cout << "B" << std::endl; }}; int main(){ base *d1 = new derived1; base *d2 = new derived2; std::function<void(base*)> func(&base::print); func(d1); func(d2); return 0;}
MainWindow::MainWindow(){ connect(button, SIGNAL(clicked()), this, SLOT(slAdd())); // connect(button, SIGNAL(clicked()), main, SLOT(add())); // хочу так}MainWindow::slAdd() {main->add();}
Class Manager : public QWidget{public slots: virtual void add() = 0; virtual void del() = 0; ...}Class ListWidget : public Manager{public slots: void add() {} void del() {}; ...}Class TreeWidget : public Manager{public slots: void add() {} void del() {}; ...}Class MainWindow : public QMainWindow{ MainWindow();public slots: void slChange(); void slAdd(); Manager *_manager;}//.cppMainWindow::MainWindow(QWidget *parent) : QMainWindow(parent){ ui->setup(this); //допустим там 2 виджета ui->listWidget и ui->treeWidget manager = ui->listWidget; connect(ui->tabWidget, SIGNAL(currentChanged(int)), this, SLOT(slChange())); // connect(ui->button, SIGNAL(clicked()), manager, SLOT(add())); // не катит connect(ui->button, SIGNAL(clicked()), this, SLOT(slAdd())); //все отлично}MainWindow::slChange(){ if (ui->tabWidget->currentWidget() == ui->listWidget) manager = ui->listWidget; if (ui->tabWidget->currentWidget() == ui->treeWidget) manager = ui->treeWidget;}MainWindow::slAdd() {manager->add();}
void add(){listWidget* point = ui.tabWidget->currentWidget();// получаем текущий виджет и присваиваем указателю.// и далее реализуем всё что угодно.}
// текущий виджет получаем.QWidget * point = ui.tabWidget->currentWidget();// и слот такой вот вызываемQMetaObject::invokeMethod(point, "add");// строку меняем "add" на "del" или другое любое наименование слота.