Russian Qt Forum
Ноябрь 23, 2024, 06:55 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Кнопка и слот-функция  (Прочитано 4962 раз)
Hatebreeder
Гость
« : Февраль 25, 2010, 19:17 »

Здравствуйте.
Нужно сделать кнопку по нажатию на которую будет появляется системное диалоговое окно.
Можно-ли как-то в SLOT() указать функцию? Или это должен быть объязательно класс потомок от QObject? Как сделать это проще? Спасибо большое.
Записан
lit-uriy
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3880


Просмотр профиля WWW
« Ответ #1 : Февраль 25, 2010, 20:09 »

не залазя в некоторые не документированные особенности - ни как.
Можно сделать простенького наследника от QObject, в нём определить слот и в слоте звать нужную функцию.
Записан

Юра.
Hatebreeder
Гость
« Ответ #2 : Февраль 25, 2010, 20:30 »

А если главная функция будет наследником, можно будет сделать все компактно?
Записан
Hatebreeder
Гость
« Ответ #3 : Февраль 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*)’|
Записан
pastor
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 2901



Просмотр профиля WWW
« Ответ #4 : Февраль 25, 2010, 23:24 »

Код
C++ (Qt)
QObject::connect(pcmd,SIGNAL(clicked()),&a, SLOT(MessageShow()));
Записан

Integrated Computer Solutions, Inc. (ICS)
http://www.ics.com/
pastor
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 2901



Просмотр профиля WWW
« Ответ #5 : Февраль 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()));
Записан

Integrated Computer Solutions, Inc. (ICS)
http://www.ics.com/
Hatebreeder
Гость
« Ответ #6 : Февраль 26, 2010, 04:25 »

Спасибо большое, - получилось.
Только если делать с наследником QObject получается ошибка:
undefined reference to `vtable for Counter'
Интересно почему и что с ней можно сделать?
Записан
lit-uriy
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3880


Просмотр профиля WWW
« Ответ #7 : Февраль 26, 2010, 05:04 »

>>Интересно почему и что с ней можно сделать?
Когда ты помещаешь объявление класса имеющего Слоты или Сигналы в cpp-файле (например, filename.cpp), то нужно в конец файла добавить строку:
#include "filename.moc"
Записан

Юра.
Hatebreeder
Гость
« Ответ #8 : Февраль 26, 2010, 13:19 »

Спасибо!
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.091 секунд. Запросов: 23.