Если я вызываю функцию MainWindow setWindowTitle после вызова a.exec () в main.cpp, я получаю ошибку сегмента (C000 0005). Есть ли способ изменить заголовок окна после запуска графического интерфейса. Я не верю, что это ограничение WIN 10, так как я мог бы сделать это на python с tkinter. Я использую qtcreator, но без форм QML.

-2
spike 9 Окт 2019 в 16:28
У вас ошибка в коде. Безусловно, мы можем установить заголовок окна в любое время, если код правильный.
 – 
Alexander V
9 Окт 2019 в 16:47
Когда exec() возвращается, графический интерфейс завершен, и вы должны выйти из функции main. Вам необходимо установить заголовок окна либо во время работы приложения, либо перед отображением окна. Но это просто, чтобы прояснить ваше непонимание того, как следует использовать exec(). Выполнять setWindowTitle после возврата exec() бессмысленно, поскольку главное окно в этот момент будет скрыто (пользователь закрыл его, чтобы выйти из приложения), но изменение его имени не повредит. Поэтому, пожалуйста, покажите код, вызывающий эту проблему. Это необычно.
 – 
Reinstate Monica
9 Окт 2019 в 17:16

2 ответа

Моя проблема была вызвана тем, что я пытался использовать указатель на мое главное окно с помощью функции MainWindow. На самом деле это было немного запутаннее, поскольку на самом деле я вызывал функцию из другого класса. Решением было передать указатель this на функцию в другом классе.

0
spike 9 Окт 2019 в 17:57

Скорее всего, вы пытаетесь использовать уничтоженный экземпляр MainWindow. Возможно, вы по ошибке установили атрибут QT_WADeleteOnClose в окне. Следующий автономный пример демонстрирует эту проблему. Атрибут может быть установлен в файле .ui, и вы можете не знать об этом.

screenshot of the example application

// https://github.com/KubaO/stackoverflown/tree/master/questions/mainwindow-crash-double-delete-58305305
#include <QtWidgets>

class Window : public QMainWindow {
   QWidget central;
   QGridLayout layout{&central};
   QLabel label{"Hello, World!"};
   QCheckBox crash{"Crash on exit"};
public:
   static bool alive;
   Window() {
      alive = true;
      layout.addWidget(&label, 0, 0);
      layout.addWidget(&crash, 1, 0);
      setCentralWidget(&central);
      connect(&crash, &QCheckBox::toggled, this, [this](){
         setAttribute(Qt::WA_DeleteOnClose, crash.isChecked());
      });
   }
   ~Window() {
      qDebug() << __FUNCTION__;
      alive = false;
   }
};
bool Window::alive;

int main(int argc, char *argv[])
{
   QApplication a(argc, argv);
   int rc;
   {
      Window w;
      w.show();
      rc = a.exec();
      Q_ASSERT(w.alive);
      w.setWindowTitle("A New Title Awaits");
      qDebug() << "We're past w.setWindowTitle()";
   }
   return rc;
}
0
Reinstate Monica 9 Окт 2019 в 18:44