R
May 22, 2017, 9:32 p.m.

Сигналы и слоты

У меня по кнопке "добавить" открывает диалог

void MainWindow::on_addButton_clicked()
{
    dialog->clear();
    //dialog->callPurpose(true);
    dialog->show();
}
( класса Диалога, создаетс в конструкторе всей программы)
MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    this->setWindowTitle("University Information System");

    dialog = new EditDialog;
    dialog->setModal(true);

    connect(dialog, EditDialog::insertToSqlModel,  this, MainWindow::insertToSqlModel);
    connect(dialog, EditDialog::editInSqlModel, this, MainWindow::editInSqlModel);
    
    openDataBase();
    sqlModel = new QSqlTableModel(this);
    sqlModel->setTable("Students");
    sqlModel->select();
    sqlModel->setEditStrategy(QSqlTableModel::OnFieldChange);
    ui->tableView->setModel(sqlModel);
    ui->tableView->horizontalHeader()->setSectionResizeMode (QHeaderView::Stretch); // растягиваем данные на весь tableview
    ui->tableView->setColumnHidden(0, true);
    ui->tableView->setColumnHidden(6, true);
    ui->tableView->show();
При нажатии кнопки "редактировать" показывается этот же диалог
void MainWindow::on_editButton_clicked()
{
    QModelIndexList indexes = ui->tableView->selectionModel()->selectedRows();
    if(!indexes.isEmpty()){
        dialog->setFirstName(sqlModel->record(indexes[0].row()).value("FirstName").toString());
        dialog->setLastName(sqlModel->record(indexes[0].row()).value("LastName").toString());
        dialog->setBirthdate(sqlModel->record(indexes[0].row()).value("Birthdate").toDate());
        dialog->setScholarship(sqlModel->record(indexes[0].row()).value("Scholarship").toBool());
        dialog->setPatronymic(sqlModel->record(indexes[0].row()).value("Patronymic").toString());

        //dialog->callPurpose(false);
        dialog->show();
    }
}
Но он заполняется данными(которые нам надо отредактировать). Вопрос, как сделать так, чтобы при нажатии кнопки окна диалога, вызывались разные слоты в зависимости от того, какой кнопкой он был вызван из мейнвиндоу. Если сделать так, что диалог будет СОЗДАВАТЬСЯ только после нажатия в основном окне программы
EditDialog  *dialog = new EditDialog;
dialog->show();
Тогда можно в зависимости от передаваемого параметры в конструкторе. Когда предпочтительнее выделять память под виджеты(если небольшая программа)? При создании программы, или при по кнопке? А еще очень небольшой вопрос, поэтому не хочется создавать тем. На скриншоте, у меня BOOLEAN тип(SQL), отображается в tableview 0 и 1-ами? а хочется по-другому, например YES, NO, или true, false

Screenshot_1.png
2
The question is asked by the articleQt/C++ - Lesson 024. Signals and Slot in Qt5

Do you like it? Share on social networks!

1
Evgenii Legotckoi
  • May 23, 2017, 12:17 p.m.
  • The answer was marked as a solution.

Вы устанавливаете данные, когда открываете диалог на редактирование или создание новых записей. С тем же самым успехом можете устанавливать переменную, которая будет определять, какой сигнал испускать в сторону MainWindow.

В случае небольшой программы с несложной логикой не особо принципиально, когда создавать виджеты или диалоговые окна. А если софт сложный и очень большой, вот тогда имеет смысл заняться кешированием диалогов при первом создании, а потом уже открывать созданный диалог, но в таких случаях правильнее будет делать специальный класса менеджер диалогов. Но и софт в данном случае будет очень большой и сложный.

а хочется по-другому, например YES, NO, или true, false

Можно наследоваться от используемой модели данных и переопределить метод data(), чтобы возвращать необходимое значение. Например, как в этой статье . Там есть Qt::DisplayRole, она отвечает за возвращаемое значение, так вот при 0 и 1 для вашей колонки можно подставлять true и false.

    Comments

    Only authorized users can post comments.
    Please, Log in or Sign up
    • Last comments
    • AK
      April 1, 2025, 11:41 a.m.
      Добрый день. В данный момент работаю над проектом, где необходимо выводить звук из программы в определенное аудиоустройство (колонки, наушники, виртуальный кабель и т.д). Пишу на Qt5.12.12 поско…
    • Evgenii Legotckoi
      March 9, 2025, 9:02 p.m.
      К сожалению, я этого подсказать не могу, поскольку у меня нет необходимости в обходе блокировок и т.д. Поэтому я и не задавался решением этой проблемы. Ну выглядит так, что вам действитель…
    • VP
      March 9, 2025, 4:14 p.m.
      Здравствуйте! Я устанавливал Qt6 из исходников а также Qt Creator по отдельности. Все компоненты, связанные с разработкой для Android, установлены. Кроме одного... Когда пытаюсь скомпилиров…
    • ИМ
      Nov. 22, 2024, 9:51 p.m.
      Добрый вечер Евгений! Я сделал себе авторизацию аналогичную вашей, все работает, кроме возврата к предидущей странице. Редеректит всегда на главную, хотя в логах сервера вижу запросы на правильн…
    • Evgenii Legotckoi
      Oct. 31, 2024, 11:37 p.m.
      Добрый день. Да, можно. Либо через такие же плагины, либо с постобработкой через python библиотеку Beautiful Soup