Nano Hash - криптовалюты, майнинг, программирование

setCentralWidget() вызывает сбой QMainWindow. Почему?

MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWindow)
{
    this->setupUi(this);
    this->setupActions();
    this->setWindowTitle(tr("CuteEdit"));
    label = new QLabel(tr("No Open Files"));
    this->setCentralWidget(label);
    label->setAlignment(Qt::AlignCenter);
}

С помощью приведенного выше кода я получаю GUI, подобный этому (это скриншот всего экране, наблюдайте только за окном, отображаемым в середине страницы электронной книги). (Я использовал QT Designer)

Теперь я хочу, чтобы пользователь выбрал File-> Open.. Появится диалоговое окно, и файл будет выбран.. Его содержимое должно отображаться в виджете * textEdit.. Функция для этого ниже..

void MainWindow::loadFile()
{
    QString filename = QFileDialog::getOpenFileName(this);
    QFile file(filename);
    if (file.open(QIODevice::ReadOnly|QIODevice::Text))
    {
        label->hide();
        textEdit->setPlainText(file.readAll());
        mFilePath = filename;
        QMainWindow::statusBar()->showMessage(tr("File successfully loaded."), 3000);
    }
}

Окно вылетает на строке: -

textEdit->setPlainText(file.readAll());

Но если я прокомментирую строку: -

это-> setCentralWidget (метка);

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

А еще мне не совсем понятна концепция CentralWidget. Пожалуйста, руководство.

31.12.2009

  • Если вам нужен полный исходный код проекта... Очень маленький.. 191 КБ. Я только новичок... goto:- mediafire.com/file/wiymz3hnzmf/cuteEdit .zip 31.12.2009
  • Это проект QTCreater.. *.pro файл 31.12.2009
  • Я добавил более общий тег (qt). 31.12.2009

Ответы:


1

JimDaniel прав в своем последнем редактировании. Взгляните на исходный код setCentralWidget():

void QMainWindow::setCentralWidget(QWidget *widget)
{
  Q_D(QMainWindow);
  if (d->layout->centralWidget() && d->layout->centralWidget() != widget) {
    d->layout->centralWidget()->hide();
    d->layout->centralWidget()->deleteLater();
  }
  d->layout->setCentralWidget(widget);
}

Видите ли вы, что если в вашем MainWindow уже есть CentralWidget(), Qt планирует удаление этого объекта с помощью удалитьпозднее()?

CentralWidget() — это корневой виджет для всех макетов и других виджетов в QMainWindow. Не виджет, который находится в центре окна. Таким образом, каждое QMainWindow, созданное мастером в Qt Creator, уже имеет этот корневой виджет. (Посмотрите на свой ui_mainwindow.h, как предложил JimDaniel, и вы увидите).

И вы запланировали удаление этого корневого виджета в конструкторе окна! Ерунда! знак равно

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

С новым годом!

31.12.2009
  • я следил за книгой DANIEL MOLKENTIN «Искусство создания приложений Qt» ... И я не получил ничего подобного. Я знаю, что это моя ошибка, я должен был посмотреть источник .. Мой плохой .. В любом случае, большое спасибо и с Новым годом ... 31.12.2009
  • Очень точный и точный ответ. Именно то, что я хотел. :) Еще раз спасибо 31.12.2009
  • Даниэль Молкентин написал мою любимую книгу по Qt. Так что продолжайте занимательное чтение. А пока не отказывайте себе в чтении официальной документации и исходного кода. Иногда одна строчка кода может рассказать больше, чем даже очень толстая книга. 31.12.2009

  • 2

    Вы уверены, что это не label->hide() вызывает сбой приложения? Возможно, Qt не нравится, когда вы прячете центральный виджет. Я использую Qt, но не так часто связываюсь с QMainWindow.

    РЕДАКТИРОВАТЬ: я скомпилировал ваш код. Я могу вам немного помочь. Не уверен, в чем конечная причина, поскольку я не использую генератор форм, но вам, вероятно, не следует сбрасывать центральный виджет на свою метку, так как он также устанавливается дизайнером, если вы откроете файл ui_mainwindow.h и посмотрите в setupGui() вы можете видеть, что у него уже установлен виджет с именем CentralWidget. Поскольку вы использовали дизайнер для своего графического интерфейса, я бы использовал его полностью и также поместил туда виджет метки. Это, вероятно, решит ваши проблемы. Может быть, кто-то еще сможет помочь...

    31.12.2009
  • Хорошо.. Я тоже прокомментировал эту строку.. Приложение все еще падает.. :-( 31.12.2009
  • Вы правы .. После вашего второго EDIT я получил решение .. Спасибо 31.12.2009

  • 3

    Я не уверен, что понял вашу проблему, как и то, что сказали ребята выше (что, я думаю, является достоверной информацией), и, похоже, это старая тема.

    Тем не менее, я думаю, что у меня была проблема, которая выглядит так, и я решил ее, поэтому я хочу поделиться своим решением, если оно кому-то поможет.

    Я пытался «сбросить» центральный виджет с помощью QLabels. У меня было три разных, я переключился с первого на второй, потом на третий и не смог вернуться к первому.

    Это мое решение, которое сработало:

    Заголовочный файл

    QLabel *imageLabel; 
    

    Конструктор

    imageLabel = new QLabel("<img src='/folder/etc.jpg' />");
    this->setCentralWidget(imageLabel);
    

    Сброс настроек

    imageLabel = NULL;
    imageLabel = new QLabel("<img src='/folder/etc.jpg' />");
    this->setCentralWidget(imageLabel);
    

    надеюсь, это поможет

    Арис

    19.04.2013
    Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

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

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..