Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > С/С++: Кроссплатформенное программирование, Qt/Gtk+/wxWidgets > Не действуют кнопки в диалоговом окне


Автор: Nikys 9.5.2013, 22:13
Доброго всем вечера или ночи.
Пишу Qt4 проект на C++. Суть в том, что есть главное окно, которое по нажатию кнопки открывает диалоговое окно. Есть Line Edit, кнопка ОК (самописная, не из QDialogButtonBox, по которой должна вызываться процедура для добавления этой строки в QList, но это другая история) и кнопка Отмена (просто закрывает форму).
Описал для обеих форм классы, описал методы и конструктор с коннектом. Формы нарисовал в QtDesigner.
Суть в том, что вторая форма открывается, но никак не реагирует на нажатия кнопок и не выполняет нужную процедуру по нажатию Enter в Line Edit (лишь закрывая при этом форму, т.е., по нажатию Enter в Line Edit). Я так понял, что либо не отсылается сигнал на слот, либо не слот не принимает сигнал. Либо я по другой статье залетел.
Все размещено в трех файлах (mainwindow.h, main.cpp, mainwindow.cpp) и юзаются формы (mainwindow.ui, newteam.ui).
В файле mainwindow.h:

Код

#ifndef MAINWINDOW_H
#define MAINWINDOW_H
 
#include <QMainWindow>
#include <QDialog>
#include <QMessageBox>
#include <QtSql>
#include <QtDebug>
#include <QList>
#include "ui_mainwindow.h"
#include "ui_newteam.h"
//...
 
//-----------------MAIN WINDOW-------------------------------------------------------
 
class MainWindow : public QMainWindow, public Ui::MainWindow
{
    Q_OBJECT
 
public:
    explicit MainWindow(QWidget *parent = 0);
 
public slots:
    void open_newTeam();
    //...
};
 
//---------------NEW TEAM WINDOW-----------------------------------------------------
 
class newTeam:public QDialog, public Ui::Dialog
{
    Q_OBJECT
 
public:
    explicit newTeam(QWidget *parent = 0);
public slots:
   void add_newTeam();
};
//...
 
#endif // MAINWINDOW_H


В mainwindow.cpp

Код

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include "ui_newteam.h"
#include "ui_watchteam.h"
#include "ui_watchtotal.h"
#include "ui_startroach.h"
 
MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent)
{
    setupUi(this);
    connect(newTeamButton, SIGNAL(clicked()), this, SLOT(open_newTeam()));
    connect(watchTeamButton, SIGNAL(clicked()), this, SLOT(open_watchTeam()));
    connect(watchTotalButton, SIGNAL(clicked()), this, SLOT(open_watchTotal()));
    connect(startRoachButton, SIGNAL(clicked()), this, SLOT(open_startRoach()));
    connect(closeMainWindow, SIGNAL(clicked()), this, SLOT(close()));
}
 
newTeam::newTeam(QWidget *parent) :
    QDialog(parent)
{
    setupUi(this);
    connect(cancelTeamButton, SIGNAL(clicked()), this, SLOT(close()));
    connect(addTeamButton, SIGNAL(clicked()), this, SLOT(add_newTeam()));
    connect(lineEdit, SIGNAL(returnPressed()), this, SLOT(add_newTeam()));
}
//...
 
void MainWindow::open_newTeam()
{
    newTeam *wTeam = new newTeam;
    wTeam->setFixedSize(400,100);
    wTeam->setupUi(wTeam);
    wTeam->setWindowFlags(Qt::WindowContextHelpButtonHint);
    wTeam->setWindowModality(Qt::ApplicationModal);
    wTeam->setWindowTitle("Нова команда");
    wTeam->show();
    wTeam->activateWindow();
}
//...
 


В main.cpp, вроде бы, нет ничего, что могло бы повлиять на проблему. Все, что связывает его с формами - объявление и показ формы из MainWindow.
Всем заранее спасибо за ответы. Прошу прощения за глупые вопросы.
Конструктивная критика по поводу кривости реализации приветствуется.

Автор: borisbn 9.5.2013, 22:58
1. Если мне не изменяет память, то moc-компилятор требует, чтобы один класс был описан в одном файле
2. Что пишется в окне вывода ?
3. Чем тебе http://qt-project.org/doc/qt-4.8/qinputdialog.html#getItem не устраивает ?

Автор: Nikys 9.5.2013, 23:27
Цитата(borisbn @  9.5.2013,  22:58 Найти цитируемый пост)
1. Если мне не изменяет память, то moc-компилятор требует, чтобы один класс был описан в одном файле

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

Цитата(borisbn @  9.5.2013,  22:58 Найти цитируемый пост)
2. Что пишется в окне вывода ?

Окно вывода считает, что программа работает целиком правильно.


Цитата(borisbn @  9.5.2013,  22:58 Найти цитируемый пост)
3. Чем тебе QInputDialog::getItem() не устраивает ?

Честно, не знал. Спасибо, пригодится. Но вопрос остается в силе, так как у меня будут и другие окна, уже не диалоговые.

Автор: Nikys 10.5.2013, 00:06
borisbn, и ещё тогда можно задать к вам вопрос? Если у меня присутствует БД в программе, то желательно также описать класс (с методами по добавлению информации и считыванию), который будет работать с ней?

Автор: math64 10.5.2013, 00:47
Чтобы избежать лишних включений заголовков, обычно используют не множественноенаследование, а включают Ui::Dialog* ui в качестве поля класса.
#include "ui_newteam.h" тогда включается в cpp файле.

Автор: Nikys 10.5.2013, 04:01
Спасибо всем за советы! После реорганизации программы должным образом (класс в отдельный хедер, отдельный cpp для него) и использование в поле класса Ui::className *ui вроде как начало работать smile
Теперь буду твердо знать, что игнорировать советы умных людей, которые документацию составляют, нехорошо. Вроде как проблема решена smile

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)