Команда назначения кнопки Qt

Я использую qt Creator для создания графического интерфейса для приложения vtk.

Я сделал действие #define и хочу назначить эту команду QPushButton.

Как заставить кнопку воспроизводить мое определение при нажатии?

пример. интерфейс->кнопка->...


person SamuelNLP    schedule 21.08.2012    source источник


Ответы (2)


Самый простой способ — определить слот ответа по умолчанию для вашей кнопки. В вашем определении класса (того же класса, который определяет кнопку) вы можете просто создать слот по умолчанию в разделе slots.

class MyMainApplication : public QMainWindow
{
  Q_OBJECT

  public:
    MyMainApplication(QWidget *parent = 0);
    ~MyMainApplication();

   // More stuff in the public section (...)

  public slots:
    void on_pushButton_clicked();    // This is the important line

  // The remaining definitions in your class
};

Теперь вы просто программируете функцию on_pushButton_clicked() в своей реализации класса, и она будет реагировать на нажатие кнопки с именем pushButton.

Синтаксис слотов по умолчанию: on_NAMEOFTHEWIDGET_NAMEOFTHESIGNAL.

Со слотами по умолчанию соединение устанавливается автоматически. Если вы хотите использовать общее имя для слота, вы должны выполнить подключение вручную. Например, скажите, что вместо on_pushButton_clicked() вы хотите использовать mySlot(). В определении класса вы должны ввести

(...)
public slots:
  void mySlot();
(...)

а в реализации класса, наверное в конструкторе, после команды ui->setupUi(this); вы бы сделали связь кнопки и своего слота:

connect(ui->pushButton, SIGNAL(clicked()), this, SLOT(mySlot()));

Последнее замечание: в данном конкретном случае я почти уверен, что слоты тоже могут быть private.

person rpsml    schedule 21.08.2012
comment
Я понимаю, о чем вы говорите, но у меня есть действие, которое я хочу, чтобы кнопка выполняла при нажатии в mainwindow.cpp, например #define AlignXAxis(), и я попытался сделать это как connect(ui->pushButton,SIGNAL(clicked ()),это,SLOT(AlignXAxis())); но это не сработает. - person SamuelNLP; 21.08.2012
comment
Что вы подразумеваете под #define AlignXAxis(). Что вам нужно сделать, так это поместить функцию void AlignXAxis() в область slots: вашего определения класса, реализовать функцию и затем установить соединение. Насколько я знаю, ваше утверждение #define ни к чему не приведет. Вы должны соединить SIGNAL (объявленный в блоке signals: виджета) с SLOT (объявленный в блоке slots: принимающего виджета). Я не понимаю, зачем вам использовать #define (который, опять же, насколько мне известно, не действует как слот). - person rpsml; 21.08.2012
comment
Да, ты прав. но когда я пытаюсь вызвать другую функцию, например, void AlignCamera(), она говорит о неопределенной ссылке на `AlignCamera()' - person SamuelNLP; 21.08.2012
comment
Определен ли AlignCamera() как класс slot? Иначе, не видя какого-то кода, невозможно что-то другое подсказать. - person rpsml; 21.08.2012
comment
@user1613749 user1613749 Вы можете подключаться только к слотам, которые являются методами подклассов QObject/QObject, помеченными как слот. #define не будет работать. (и в любом случае считаются плохим стилем в C++). - person Frank Osterfeld; 22.08.2012
comment
Я определил свою функцию void AlignCamera() на верхнем уровне, то есть не внутри какой-либо другой функции. но я могу перейти к mainwindow.h и просто поместить void AlignCamera() в приватный слот. - person SamuelNLP; 22.08.2012

Вам нужно использовать функцию Qt, которая называется Сигналы и слоты. Многие объекты могут посылать сигналы при взаимодействии с ними. Примером является сигнал "clicked()", испускаемый QPushButton, или сигнал "triggered()", который испускается при нажатии на QAction.

Основная идея заключается в подключении сигнала к слоту. Слоты — это функции, которые вызываются при поступлении сигнала. Я могу предоставить вам пример PyQt:

QtCore.QObject.connect(self.ui.myButton, QtCore.SIGNAL("clicked()"), self.someFunction)

Код C++ не должен сильно отличаться. Проверьте примеры Qt, они содержат много полезного.

person ivica    schedule 21.08.2012