Форум русскоязычного сообщества Ubuntu


Считаете, что Ubuntu недостаточно дружелюбна к новичкам?
Помогите создать новое Руководство для новичков!

Автор Тема: Qt:переход к слоту из нового диалога  (Прочитано 4251 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн HolyMacaroni

  • Автор темы
  • Участник
  • *
  • Сообщений: 210
  • мегавольт
    • Просмотр профиля
Qt:переход к слоту из нового диалога
« : 05 Сентября 2010, 21:58:23 »
Нажимаю "перейти к слоту" в созданном диалоге(SettingsDialog), заголовочный файл подключен, где собственно определен класс, и компилируется нормально, но почему то пишет вот это
Цитировать
Не удалось найти в .../mainwindow.cpp определение класса 'Ui::SettingsDialog'

ПС: понимаю что ошибка новичка, но не могу найти решение.
« Последнее редактирование: 05 Сентября 2010, 23:28:38 от HolyMacaroni »
Asus X50N Ubuntu 10.04

Оффлайн VestniK

  • Активист
  • *
  • Сообщений: 594
    • Просмотр профиля
Re: Qt:переход к слоту из нового диалога
« Ответ #1 : 06 Сентября 2010, 00:08:29 »
попробуй собрать проект в консли и проверь, что uic вызывается. Проверь, что сответствующий *.ui файл упомянут в переменной FORMS файла проекта.

Оффлайн HolyMacaroni

  • Автор темы
  • Участник
  • *
  • Сообщений: 210
  • мегавольт
    • Просмотр профиля
Re: Qt:переход к слоту из нового диалога
« Ответ #2 : 06 Сентября 2010, 14:33:23 »
попробуй собрать проект в консли и проверь, что uic вызывается.не совсем понял , сделал так:

make
g++ -Wl,-O1 -o TraningJornal main.o mainwindow.o moc_mainwindow.o    -L/usr/lib -lQtSql -lQtGui -lQtCore -lpthread
ни каких ошибок не вижу, все скомпилировалось

Проверь, что сответствующий *.ui файл упомянут в переменной FORMS файла проекта.все прописано
Asus X50N Ubuntu 10.04

Оффлайн VestniK

  • Активист
  • *
  • Сообщений: 594
    • Просмотр профиля
Re: Qt:переход к слоту из нового диалога
« Ответ #3 : 06 Сентября 2010, 15:08:23 »
Цитировать
не совсем понял , сделал так:
make
g++ -Wl,-O1 -o TraningJornal main.o mainwindow.o moc_mainwindow.o    -L/usr/lib -lQtSql -lQtGui -lQtCore -lpthread
Измени время модификации твоего ui файла (например touch path/to/form.ui) и запусти make, проверь, что вызывается команда uic (она из *.ui файла генерит плюсовый хедер, который ты потом подключаешь).

Но на самом деле проверь, что в mainwindow.cpp у тебя подключается ui_settingsdialog.h (или ui_SettingsDialog.h если форма у тебя имеет имя SettingsDialog.ui)

Оффлайн HolyMacaroni

  • Автор темы
  • Участник
  • *
  • Сообщений: 210
  • мегавольт
    • Просмотр профиля
Re: Qt:переход к слоту из нового диалога
« Ответ #4 : 06 Сентября 2010, 15:46:41 »
make
/usr/bin/uic-qt4 ../ListExercise.ui -o ui_ListExercise.h
g++ -c -pipe -O2 -Wall -W -D_REENTRANT -DQT_NO_DEBUG -DQT_SQL_LIB -DQT_GUI_LIB -DQT_CORE_LIB -DQT_SHARED -I/usr/share/qt4/mkspecs/linux-g++ -I. -I/usr/include/qt4/QtCore -I/usr/include/qt4/QtGui -I/usr/include/qt4/QtSql -I/usr/include/qt4 -I. -I. -o mainwindow.o mainwindow.cpp
g++ -Wl,-O1 -o TraningJornal main.o mainwindow.o moc_mainwindow.o    -L/usr/lib -lQtSql -lQtGui -lQtCore -lpthread

все так же не находит
Asus X50N Ubuntu 10.04

Оффлайн VestniK

  • Активист
  • *
  • Сообщений: 594
    • Просмотр профиля
Re: Qt:переход к слоту из нового диалога
« Ответ #5 : 06 Сентября 2010, 16:26:23 »
Запости сюда mainwindow.cpp и mainwindow.h

Оффлайн HolyMacaroni

  • Автор темы
  • Участник
  • *
  • Сообщений: 210
  • мегавольт
    • Просмотр профиля
Re: Qt:переход к слоту из нового диалога
« Ответ #6 : 06 Сентября 2010, 17:14:41 »
mainwindow.cpp
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include "ui_CreateEditTran.h"
#include "ui_SettingsDialog.h"
#include "ui_ListExercise.h"
#include <QTextCharFormat>
#include <QSqlDatabase>
#include <QtCore/QtDebug>
#include <QMessageBox>
#include <QSqlError>
#include <QTextCodec>
#include <QString>
#include <QSqlQuery>
#include <QPainter>

QTextCodec *codec = QTextCodec::codecForName("UTF-8");
Ui_ListExercise uiListExerciseDialog;

QSqlDatabase MainWindow::ADD_DB (void)
{

    QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE");

    db.setHostName("bigblue");
    db.setDatabaseName("flightdb");
    db.setUserName("acarlson");
    db.setPassword("1uTbSbAs");

    return db;

}


void MainWindow::OPEN_DB(QSqlDatabase db)
{
    if(!db.open())
    {
        QSqlError MyError=db.lastError();
        QMessageBox msgBox;
        msgBox.setText(codec->toUnicode("Ошибка при открытии базы данных "));
        msgBox.setIcon(QMessageBox::Critical);
        msgBox.setInformativeText(MyError.text());
        msgBox.setStandardButtons(QMessageBox::Ok);
        msgBox.exec();
    }
}


QString IntToString(int numb)
{
    char s[8];
    sprintf(s,"%i",numb);
    return s;
};

void MainWindow::LABEL_COLOR_CALENDAR(QDate getDate,int r, int g, int b, int a)
{
    QTextCharFormat format;
    QBrush brush;
    QColor color;
//    int r=200,g=145,b=234,a=255;
    color.setRgb(r,g,b,a);
    brush.setColor(color);
    format.setBackground(brush);

    ui->calendarWidget->setDateTextFormat(getDate,format);

}

QString MainWindow::CREATE_NAME_TABLE(QDate getDate)
{
    QString NameTable;
    NameTable.append(IntToString(getDate.day()));
    NameTable.append("_");
    NameTable.append(IntToString(getDate.month()));
    NameTable.append("_");
    NameTable.append(IntToString(getDate.year()));
    return NameTable;
}

MainWindow::MainWindow(QWidget *parent) :
        QMainWindow(parent),
        ui(new Ui::MainWindow)
{
    ui->setupUi(this);

}


MainWindow::~MainWindow()
{
    delete ui;

}

void MainWindow::changeEvent(QEvent *e)
{
    QMainWindow::changeEvent(e);
    switch (e->type()) {
    case QEvent::LanguageChange:
        ui->retranslateUi(this);
        break;
    default:
        break;
    }
}

void MainWindow::on_pushButton_clicked()
{

    QSqlDatabase db = ADD_DB ();
    OPEN_DB(db);

    QDate getDate=ui->calendarWidget->selectedDate();
    //    qDebug() << getDate.day() <<getDate.month()<<getDate.year();

    LABEL_COLOR_CALENDAR(getDate,200, 145,234,255);
    QString NameTable=CREATE_NAME_TABLE(getDate);

    qDebug() << NameTable;

    QSqlQuery query;
    QString   str;
    str="SELECT * FROM date_%1;";
    str=str.arg(NameTable);

    if (!query.exec(str))
    {
        str  = "CREATE TABLE  date_%1 ( "
                            "number INTEGER PRIMARY KEY NOT NULL, "
                            "exercise        VARCHAR(128), "
                            "set1            VARCHAR(128), "
                            "set2            VARCHAR(128), "
                            "set3            VARCHAR(128), "
                            "set4            VARCHAR(128), "
                            "set5            VARCHAR(128), "
                            "set6            VARCHAR(128), "
                            "set7            VARCHAR(128), "
                            "set8            VARCHAR(128), "
                            "set9            VARCHAR(128), "
                            "set10           VARCHAR(128)  "
                            ");";


               str = str.arg(NameTable);
               qDebug() << str ;

               if(!query.exec(str))
               {
                   QSqlError MyError=db.lastError();
                   QString SError=MyError.text();
                   QMessageBox msgBox;
                   msgBox.setText(codec->toUnicode("Ошибка при создании таблицы "));
                   msgBox.setIcon(QMessageBox::Critical);
                   msgBox.setInformativeText(MyError.text());
                   msgBox.setStandardButtons(QMessageBox::Ok);
                   msgBox.exec();
               }

    }

    //    отрываем данную таблицу
    str="SELECT * FROM date_%1;";
    str=str.arg(NameTable);
    if(!query.exec(str))
    {
        QSqlError MyError=db.lastError();
        QString SError=MyError.text();
        QMessageBox msgBox;
        msgBox.setText(codec->toUnicode("Ошибка при открытии таблицы "));
        msgBox.setIcon(QMessageBox::Critical);
        msgBox.setInformativeText(MyError.text());
        msgBox.setStandardButtons(QMessageBox::Ok);
        msgBox.exec();
    }



    Ui_CreateEditTran uiDialog;
    QDialog *dialog= new QDialog;
    uiDialog.setupUi(dialog);
    dialog->show();



    int NumbColumnTable=uiDialog.NumbSet->value();
    int NumbRowTable=uiDialog.NumbExercise->value();

    uiDialog.tableWidget->setColumnCount(NumbColumnTable);
    uiDialog.tableWidget->setRowCount(NumbRowTable);

    QStringList       StringHorizontalHeaderLabels;
    QStringList       StringVerticalHeaderLabels;

    StringHorizontalHeaderLabels <<codec->toUnicode("Упражение");
    int i=1;
    while(i!=NumbColumnTable)
    {
        StringHorizontalHeaderLabels <<IntToString(i);
        i++;
    }

    uiDialog.tableWidget->setHorizontalHeaderLabels(StringHorizontalHeaderLabels);


}

void MainWindow::on_pushButton_2_clicked()
{
    QDate getDate=ui->calendarWidget->selectedDate();
    LABEL_COLOR_CALENDAR(getDate,255, 255,255,255);

}

void MainWindow::on_Settings_clicked()
{
    Ui_SettingsDialog uiDialog;
    QDialog *dialog= new QDialog;
    uiDialog.setupUi(dialog);
    dialog->show();






//QBrush brush;
//QColor color;
//int r=200,g=145,b=234,a=120;
//color.setRgb(r,g,b,a);
//brush.setColor(color);
//       QPalette p = uiDialog.tableWidget->palette();
////p.setBrush(QPalette::Normal,QPalette::Button,brush);
//p.setColor(QPalette::Normal,QPalette::Button,color);
//       uiDialog.tableWidget->setPalette(p);
//
//// uiDialog.tableWidget->setBackgroundRole();

QPainter painter(dialog);
painter.setRenderHint(QPainter::Antialiasing,true);
painter.setPen(QPen(Qt::black,15,Qt::DashDotDotLine,Qt::RoundCap));
painter.setBrush(QBrush(Qt::green,Qt::SolidPattern));
painter.drawEllipse(80,80,400,240);



}

void MainWindow::on_ListExercise_clicked()
{


    QDialog *dialog= new QDialog;
    uiListExerciseDialog.setupUi(dialog);
    dialog->show();

    int NumbColumnTable=1;
    int NumbRowTable=1;
    uiListExerciseDialog.tableWidget->setColumnCount(NumbColumnTable);
    uiListExerciseDialog.tableWidget->setRowCount(NumbRowTable);

    QStringList       StringHorizontalHeaderLabels;
    StringHorizontalHeaderLabels <<codec->toUnicode("Список упражений");

    uiListExerciseDialog.tableWidget->setHorizontalHeaderLabels(StringHorizontalHeaderLabels);

//    растягиваем столбец по всей ширине таблицы
    QSize size=uiListExerciseDialog.tableWidget->size();
    uiListExerciseDialog.tableWidget->setColumnWidth(0,size.width());

   
}

mainwindow.h
#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <QSqlDatabase>
 #include <QDate>

namespace Ui {
    class MainWindow;
}

class MainWindow : public QMainWindow {
    Q_OBJECT
public:
    MainWindow(QWidget *parent = 0);
    ~MainWindow();
QSqlDatabase ADD_DB (void);
void OPEN_DB(QSqlDatabase db);
void LABEL_COLOR_CALENDAR(QDate getDate,int r, int g, int b, int a);
QString CREATE_NAME_TABLE(QDate getDate);

protected:
    void changeEvent(QEvent *e);

private:
    Ui::MainWindow *ui;

private slots:
    void on_ListExercise_clicked();
    void on_Settings_clicked();
    void on_pushButton_2_clicked();
    void on_pushButton_clicked();
};

#endif // MAINWINDOW_H


ПС:извините за большой текст, мож выложить в другом месте... в споллере тоже хреново выглядит
« Последнее редактирование: 06 Сентября 2010, 17:18:33 от HolyMacaroni »
Asus X50N Ubuntu 10.04

Оффлайн VestniK

  • Активист
  • *
  • Сообщений: 594
    • Просмотр профиля
Re: Qt:переход к слоту из нового диалога
« Ответ #7 : 06 Сентября 2010, 17:29:02 »
Всё я кажется тебя не так понял. У тебя ошибка не при компиляции а при нажатии какой-то кнопочки ни то в QtCreator ни то в QtDesigner? Всё собирается и работает?

Если вечером время будет могу пройтись по коду с критикой, он у тебя очень грязный и содержит некоторое количество примеров как делать не следует, даже если оно так работает. Главное замечание:
Цитировать
QDialog *dialog= new QDialog;
uiListExerciseDialog.setupUi(dialog);
dialog->show();
так делать не стоит. Заводишь отдельный класс отнаследованный от QDialog для которого делаешь форму и её используешь. Код легче расширять, сопровождать и использовать в других частях проекта.

Оффлайн HolyMacaroni

  • Автор темы
  • Участник
  • *
  • Сообщений: 210
  • мегавольт
    • Просмотр профиля
Re: Qt:переход к слоту из нового диалога
« Ответ #8 : 06 Сентября 2010, 19:08:24 »
Цитировать
Всё я кажется тебя не так понял. У тебя ошибка не при компиляции а при нажатии какой-то кнопочки ни то в QtCreator ни то в QtDesigner? Всё собирается и работает?
Видать я хреново объясняю ;D, все собирается и работает.
Я не могу создать обработчик события, слот, в созданном мной диалоговом окне, вот что мне пишет QtCreator:


Asus X50N Ubuntu 10.04

Оффлайн VestniK

  • Активист
  • *
  • Сообщений: 594
    • Просмотр профиля
Re: Qt:переход к слоту из нового диалога
« Ответ #9 : 06 Сентября 2010, 19:23:59 »
А когда пробуешь создать слот руками, какое сообщение об ошибке выдают пальцы? :)

Честно говоря не знаю что вообще делает этот пункт меню в QtCreator (я им крайне редко пользуюсь). Лучше просто в нужном тебе классе создай слот сам это одна строчка в хедере и две строчки в исходнике (+собственно сам код слота).

Оффлайн HolyMacaroni

  • Автор темы
  • Участник
  • *
  • Сообщений: 210
  • мегавольт
    • Просмотр профиля
Re: Qt:переход к слоту из нового диалога
« Ответ #10 : 06 Сентября 2010, 19:40:48 »
А когда пробуешь создать слот руками, какое сообщение об ошибке выдают пальцы? :)
они не знают как это сделать:(
Asus X50N Ubuntu 10.04

Оффлайн VestniK

  • Активист
  • *
  • Сообщений: 594
    • Просмотр профиля
Re: Qt:переход к слоту из нового диалога
« Ответ #11 : 06 Сентября 2010, 19:49:46 »
Тогда давай их обучать :)

Что именно ты сейчас хочешь сделать?
Hints:
1) Добавить слот к классу MainWindow, который будет реагировать на какой-то из сигналов в форме mainwindow.ui
2) Добавить слот куда угодно, который будет реагировать на какой-то из слотов в одной из форм CreateEditTran.ui, SettingsDialog.ui или ListExercise.ui

Оффлайн HolyMacaroni

  • Автор темы
  • Участник
  • *
  • Сообщений: 210
  • мегавольт
    • Просмотр профиля
Re: Qt:переход к слоту из нового диалога
« Ответ #12 : 06 Сентября 2010, 19:55:05 »
второе
в принципе, основная проблема для меня ,это то что класс должен быть наследником QMainWindow
« Последнее редактирование: 06 Сентября 2010, 20:00:03 от HolyMacaroni »
Asus X50N Ubuntu 10.04

Оффлайн VestniK

  • Активист
  • *
  • Сообщений: 594
    • Просмотр профиля
Re: Qt:переход к слоту из нового диалога
« Ответ #13 : 06 Сентября 2010, 20:07:46 »
Перво наперво тебе нужно создать отдельный класс для диалога. Он будет наследоваться от QDialog и будет использовать твою форму. На каждый диалог у тебя будет по классу. Пример можешь посмотреть вот тут:
http://gitorious.org/mahjong-night/mahjong-night/blobs/master/mahjong-night/client/connecttohostdialog.h
http://gitorious.org/mahjong-night/mahjong-night/blobs/master/mahjong-night/client/connecttohostdialog.cpp
Создав отдельный класс просто опердели в нём нужные тебе слоты которые будут реагировать на действия пользователя только в нём.

Дальше, в твоём коде ты вызываешь dialog->show(); чтобы отобразить диалог. Это можно использовать если ты хочешь чтобы твой диалог был не модальным (не блокировал главное окно). Подозреваю, что тебе это на самом деле не нужно и лучше сделать dialog->exec(); это создаст модальный диалог и заблокирует выполнение основного потока твоей программы. Такой подход проще и в большенстве случаев именно он и требуется. Посмотри как я отображаю диалог вот здесь:
http://gitorious.org/mahjong-night/mahjong-night/blobs/master/mahjong-night/client/mainform.cpp#line109
никокой свистопляски с дополнительными сигналами и слотами. Попросил пользователя ввести нужные мне данные дождался когда диалог будет закрыт и выполнил дальнейшие действия.
« Последнее редактирование: 12 Сентября 2010, 23:51:08 от VestniK »

Оффлайн HolyMacaroni

  • Автор темы
  • Участник
  • *
  • Сообщений: 210
  • мегавольт
    • Просмотр профиля
Re: Qt:переход к слоту из нового диалога
« Ответ #14 : 12 Сентября 2010, 01:27:22 »
VestniK, большое спасибо, вроде разобрался, но не совсем:), ну по крайней мере работает.

1. Создаю класс для диалога унаследованный от QDialog
2. описываю слот для события.
3. соединяю слот и сигнал в конструкторе.

Но есть одна вещь, которая раздражает, ui_название диалога.h генерируется каждый раз после редактирования диалога, и в нем каждый описывает класс, с таким же названием как у меня, до сих пор я просто удалял от туда это определение, вот сейчас писал вопрос  и до меня дошло, что можно просто другое название классу дать ;D
Asus X50N Ubuntu 10.04

 

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