Russian Qt Forum

Qt => Общие вопросы => Тема начата: Hatebreeder от Февраль 25, 2010, 19:17



Название: Кнопка и слот-функция
Отправлено: Hatebreeder от Февраль 25, 2010, 19:17
Здравствуйте.
Нужно сделать кнопку по нажатию на которую будет появляется системное диалоговое окно.
Можно-ли как-то в SLOT() указать функцию? Или это должен быть объязательно класс потомок от QObject? Как сделать это проще? Спасибо большое.


Название: Re: Кнопка и слот-функция
Отправлено: lit-uriy от Февраль 25, 2010, 20:09
не залазя в некоторые не документированные особенности - ни как.
Можно сделать простенького наследника от QObject, в нём определить слот и в слоте звать нужную функцию.


Название: Re: Кнопка и слот-функция
Отправлено: Hatebreeder от Февраль 25, 2010, 20:30
А если главная функция будет наследником, можно будет сделать все компактно?


Название: Re: Кнопка и слот-функция
Отправлено: Hatebreeder от Февраль 25, 2010, 21:40
Код:
#include <QtGui>
#include <QApplication>
#include <QPushButton>


class Counter : public QObject
{
   Q_OBJECT
  public slots:
    void MessageShow(int value);
 };
void Counter::MessageShow(int value)
{
     QMessageBox* pmbx = new QMessageBox(QMessageBox::Information,
                             "MessageBox",
                             "Simple Message",
                              QMessageBox::Yes |  QMessageBox::No |  QMessageBox::Cancel
                              );
      int n = pmbx->exec();
      delete pmbx;
}




int main(int argc, char* argv[])
{
    QApplication app(argc, argv);
    Counter a;
    QWidget wgt;

    QPushButton* pcmd = new QPushButton ("&Button");
    QObject::connect(pcmd,SIGNAL(clicked()),a, SLOT(MessageShow()));



     //Layout setup
    QVBoxLayout* pvbxLayot = new QVBoxLayout;
    pvbxLayot ->addWidget(pcmd);

    wgt.setLayout(pvbxLayot);
    wgt.show();
    return app.exec();
}
Почему сие чудо может не работать?
error: no matching function for call to ‘QObject::connect(QPushButton*&, const char*, Counter&, const char*)’|


Название: Re: Кнопка и слот-функция
Отправлено: pastor от Февраль 25, 2010, 23:24
Код
C++ (Qt)
QObject::connect(pcmd,SIGNAL(clicked()),&a, SLOT(MessageShow()));


Название: Re: Кнопка и слот-функция
Отправлено: pastor от Февраль 25, 2010, 23:30
Вспомогательный наследник от QObject в данном случае ненужен. Что нам мешает сделать так:

Код
C++ (Qt)
QMessageBox *msgBox = new QMessageBox();
msgBox->setText("Message");
 
QPushButton* pcmd = new QPushButton ("&Button");
 
QObject::connect(pcmd,SIGNAL(clicked()),msgBox, SLOT(exec()));


Название: Re: Кнопка и слот-функция
Отправлено: Hatebreeder от Февраль 26, 2010, 04:25
Спасибо большое, - получилось.
Только если делать с наследником QObject получается ошибка:
undefined reference to `vtable for Counter'
Интересно почему и что с ней можно сделать?


Название: Re: Кнопка и слот-функция
Отправлено: lit-uriy от Февраль 26, 2010, 05:04
>>Интересно почему и что с ней можно сделать?
Когда ты помещаешь объявление класса имеющего Слоты или Сигналы в cpp-файле (например, filename.cpp), то нужно в конец файла добавить строку:
#include "filename.moc"


Название: Re: Кнопка и слот-функция
Отправлено: Hatebreeder от Февраль 26, 2010, 13:19
Спасибо!