2016-06-02 14 views
0

Я пытаюсь создать функцию, которая покажет виджет в зависимости от переданного ему QWidget.QWidget через слот

у меня есть:

position_widget = new positionWidget(); 
timing_widget = new timingWidget(); 
... 

void MainWindow::showScreen(QWidget *w) 
{ 
    ui->screenWidget->layout()->addWidget(w); 
    w->show(); 
} 


void MainWindow::doConnects() 
{ 
QObject::connect(buttons_widget, SIGNAL(showPositionScreen_signal()), this, SLOT(showScreen(position_screen))); 
QObject::connect(buttons_widget, SIGNAL(showTimingScreen_signal()), this, SLOT(showScreen(timing_screen))); 
} 

Ничего не происходит, когда я нажимаю на кнопку, и он приходит с 'Нет такой слот MainWindow :: ShowScreen (timing_screen)'

+1

Это должно быть 'SLOT (showScreen (QWidget *))' вместо – vahancho

+0

Используйте автозаполнение Qt Creator для завершения сигналов и слотов, особенно с помощью соединений стиля ole (с использованием макросов SIGNAL и SLOT). Предпочитаете, что новый стиль соединяется с ошибкой компиляции, если вы ошибаетесь. – hyde

+0

@thuga, используя значение, а не тип для макроса слота, похоже на вопрос, который вы указали, но есть также проблема с несоответствием аргументов в его сигналах и слотах. – tobilocker

ответ

1

Если showScreen объявлен как Qt Slot в вашей mainwindow.h нравится:

private slots: 
    void showScreen(QWidget* w); 

И ваши сигналы объявлены в buttons_widget

signals: 
    void showPositionScreen_signal(QWidget* w); //Note that signal needs same type as slot 
    void showTimingScreen_signal(QWidget* w); 

Затем вы можете подключить этот сигнал к слоту. Обратите внимание, что аргументы сигналов и слотов должны совпадать. Ie: "The signals and slots mechanism is type safe: The signature of a signal must match the signature of the receiving slot. (In fact a slot may have a shorter signature than the signal it receives because it can ignore extra arguments.)"

connect(buttons_widget, SIGNAL(showPositionScreen_signal(QWidget*)), this, SLOT(showScreen(QWidget*))); 

И вы будете излучать position_screen и timing_screen изнутри buttons_widget как:

emit showPositionScreen_signal(position_screen); 

Как thuga отметил, что сказать, что вам не нужно два разных сигналы. Для передачи другого QWidget в тот же слот просто испустите этот сигнал. I.e .:

emit showPositionScreen_signal(timing_screen); 

И я бы предложил изменить название вашего сигнала на что-то подходящее.

+0

Зачем использовать два сигнала, которые делают то же самое? Одного хватит, поскольку вы передаете виджет в качестве аргумента. – thuga

+0

@thuga Это правда, хорошая точка. Выше будет работать, я укажу, что в моем ответе ... Спасибо – tobilocker

+0

Thats great, many thanks – easty