Куда девается значок программы в панели задач?
Вот какой вопрос. Создал программу с двумя окнами. При работе программы открывается первое окно, затем если нажать на кнопку на этом окне, то открывается другое окно. Вроде ничего необычного. Первая проблема: после того, как открылось второе окно пропадает значок программы на панели задач. Как сделать чтобы он сохранился? И как раз из-за этой проблемы, второе окно не сворачивается нормально. Тупо просто в угол рабочего стола уходит. В чем дело? Например вот такой код: Первое окно:
from PyQt5 import QtCore, QtGui, QtWidgets class Window_1(object): def setupUi(self, MainWindow): MainWindow.setObjectName("MainWindow") MainWindow.resize(300, 146) self.centralwidget = QtWidgets.QWidget(MainWindow) self.centralwidget.setObjectName("centralwidget") self.pushButton = QtWidgets.QPushButton(self.centralwidget) self.pushButton.setGeometry(QtCore.QRect(40, 30, 221, 41)) self.pushButton.setObjectName("pushButton") MainWindow.setCentralWidget(self.centralwidget) self.menubar = QtWidgets.QMenuBar(MainWindow) self.menubar.setGeometry(QtCore.QRect(0, 0, 300, 21)) self.menubar.setObjectName("menubar") MainWindow.setMenuBar(self.menubar) self.statusbar = QtWidgets.QStatusBar(MainWindow) self.statusbar.setObjectName("statusbar") MainWindow.setStatusBar(self.statusbar) self.retranslateUi(MainWindow) QtCore.QMetaObject.connectSlotsByName(MainWindow) def retranslateUi(self, MainWindow): _translate = QtCore.QCoreApplication.translate MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow")) self.pushButton.setText(_translate("MainWindow", "Нажми"))
Второе окно:
from PyQt5 import QtCore, QtGui, QtWidgets class Window_2(object): def setupUi(self, MainWindow): MainWindow.setObjectName("MainWindow") MainWindow.resize(290, 143) self.centralwidget = QtWidgets.QWidget(MainWindow) self.centralwidget.setObjectName("centralwidget") self.label = QtWidgets.QLabel(self.centralwidget) self.label.setGeometry(QtCore.QRect(80, 30, 171, 71)) self.label.setObjectName("label") MainWindow.setCentralWidget(self.centralwidget) self.statusbar = QtWidgets.QStatusBar(MainWindow) self.statusbar.setObjectName("statusbar") MainWindow.setStatusBar(self.statusbar) self.retranslateUi(MainWindow) QtCore.QMetaObject.connectSlotsByName(MainWindow) def retranslateUi(self, MainWindow): _translate = QtCore.QCoreApplication.translate MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow")) self.label.setText(_translate("MainWindow", "Тут что-то написано"))
И главное которое запускает:
import sys, os from PyQt5.QtWidgets import * from PyQt5.QtGui import * from PyQt5 import QtWidgets, QtGui from Window1 import Window_1 from Window2 import Window_2 class Window(QMainWindow): def __init__(self, parent=None): super(Window, self).__init__(parent) self.Win = Window_1() self.Win.setupUi(self) self.Win.pushButton.clicked.connect(self.check) def check(self): des = Window2(parent=self) self.hide() class Window2(QMainWindow): def __init__(self, parent=None): super(Window2, self).__init__(parent) self.Win_2 = Window_2() self.Win_2.setupUi(self) self.show() if __name__ == '__main__': app = QApplication(sys.argv) window = Window() window.show() sys.exit(app.exec_())
Глава 3. Создание главного окна приложения
В этой главе мы рассмотрим процесс создания главного окна приложения. По прочтении ее, вы сможете построить интерфейс приложения, который будет содержать меню, панели инструментов, строку состояния и набор дополнительных диалогов.

Рисунок 3.1. Приложение — электронная таблица.
Главное окно — это своего рода каркас, на который «натягивается» весь пользовательский интерфейс приложения. Здесь мы рассмотрим пример создания главного окна электронной таблицы. Внешний вид нашего будущего приложения приводится на рисунке 3.1. В этом приложении мы будем использовать диалоги «Find», «Go-to-Cell» и «Sort», которые были созданы нами в Главе 2. Внутри большинства приложений с графическим интерфейсом «прячется» код, который обеспечивает основные функциональные возможности программы, например, работа с файлами или обработка данных, представляемых пользовательским интерфейсом. В Главе 4 мы покажем — как реализуется такого рода функциональность, на примере нашей электронной таблицы.
3.1. Создание класса-наследника от QMainWindow.
Главное окно любого приложения — это класс-наследник QMainWindow. Большинство приемов, используемых при создания диалогов и о которых мы говорили в Главе 2, вполне применимы и при создании главного окна приложения. Главное окно может быть создано в Qt Designer , но мы все будем делать «вручную», чтобы продемонстрировать процесс создания главного окна во всех деталях. Если вы предпочитаете визуальное проектирование — прочитайте главу «Creating a Main Window Application» в справочном руководстве к Qt Designer . Исходные тексты главного окна будут располагаться в двух файлах: mainwindow.cpp и mainwindow.cpp. Начнем с файла заголовка:
#ifndef MAINWINDOW_H #define MAINWINDOW_H #include #include class QAction; class QLabel; class FindDialog; class Spreadsheet; class MainWindow : public QMainWindow < Q_OBJECT public: MainWindow(QWidget *parent = 0, const char *name = 0); protected: void closeEvent(QCloseEvent *event); void contextMenuEvent(QContextMenuEvent *event);
Это определение класса MainWindow -- наследника QMainWindow. Оно содержит макрос Q_OBJECT, поскольку реализует свои собственные сигналы и слоты.
Функция closeEvent(), в классе QWidget, объявлена как виртуальная. Она автоматически вызывается перед завершением приложения. Мы перекрываем ее в MainWindow для того, чтобы иметь возможность спросить у пользователя -- желает ли он сохранить произведенные изменения, а также для того, чтобы сохранить на диск пользовательские настройки. Аналогично, функция contextMenuEvent() вызывается, когда пользователь щелкает правой кнопкой мыши по виджету. Мы перекрываем ее в MainWindow для того, чтобы вывести контекстное меню.
private slots: void newFile(); void open(); bool save(); bool saveAs(); void find(); void goToCell(); void sort(); void about();
Реализация действий некоторых пунктов меню, таких как File|New и Help|About, выполнена в виде приватных слотов MainWindow. Большинство слотов имеют тип void, но слоты save() и saveAs возвращают результат типа bool. Значение, возвращаемое слотом, игнорируется в случае вызова по сигналу, но когда слот вызывается как обычная функция, то мы получаем от него возвращаемое значение, которое можем использовать для своих нужд.
void updateCellIndicators(); void spreadsheetModified(); void openRecentFile(int param); private: void createActions(); void createMenus(); void createToolBars(); void createStatusBar(); void readSettings(); void writeSettings(); bool maybeSave(); void loadFile(const QString &fileName); void saveFile(const QString &fileName); void setCurrentFile(const QString &fileName); void updateRecentFileItems(); QString strippedName(const QString &fullFileName);
Дополнительные приватные функции, необходимые для обслуживания пользовательского интерфейса.
Spreadsheet *spreadsheet; FindDialog *findDialog; QLabel *locationLabel; QLabel *formulaLabel; QLabel *modLabel; QStringList recentFiles; QString curFile; QString fileFilters; bool modified; enum < MaxRecentFiles = 5 >; int recentFileIds[MaxRecentFiles]; QPopupMenu *fileMenu; QPopupMenu *editMenu; QPopupMenu *selectSubMenu; QPopupMenu *toolsMenu; QPopupMenu *optionsMenu; QPopupMenu *helpMenu; QToolBar *fileToolBar; QToolBar *editToolBar; QAction *newAct; QAction *openAct; QAction *saveAct; . QAction *aboutAct; QAction *aboutQtAct; >; #endif
Кроме функций, класс главного окна имеет ряд скрытых переменных. Все они будут описаны по мере необходимости.
Теперь перейдем к реализации:
#include #include #include #include #include #include #include #include #include #include #include #include "cell.h" #include "finddialog.h" #include "gotocelldialog.h" #include "mainwindow.h" #include "sortdialog.h" #include "spreadsheet.h"
Здесь подключаются заголовки всех классов Qt, которые используются в приложении, а также заголовок класса главного окна и ряд других заголовочных файлов, таких как finddialog.h, gotocelldialog.h и sortdialog.h, которые мы создали в предыдущей главе.
MainWindow::MainWindow(QWidget *parent, const char *name) : QMainWindow(parent, name)
Конструктор начинается с создания виджета Spreadsheet, который будет центральным виджетом главного окна. Центральный виджет занимает все пространство, находящееся между панелью инструментов (toolbar) и строкой состояния (statusbar). Класс Spreadsheet является потомком класса QTable и добавляет некоторые свойства, характерные для электронных таблиц. Среди них можно назвать поддержку формул, которая будет реализована в Главе 4.

Рисунок 3.2. Раскладка виджетов в главном окне.
- Сохранение изображений в файлы и загрузка из файлов, в процессе работы приложения.
- Включение изображений формата XPM в исходный код.
- Механизм "коллекции изображений" ("image collection").
В данном примере мы будем использовать механизм "коллекции изображений", поскольку работать с ним намного проще, чем загружать файлы в процессе исполнения. К тому же он может взаимодействовать со всеми, поддерживаемыми библиотекой, графическими форматами. Все изображения мы будем хранить в каталоге images. Чтобы создать файл на языке C++ (он будет создан утилитой uic), который будет хранить наши изображения, добавим следующие строки в файл .pro:
IMAGES = images/icon.png \ images/new.png \ images/open.png \ . images/find.png \ images/gotocell.png
Изображения будут помещены в исполняемый файл приложения и могут быть получены вызовом QPixmap::fromMimeSource(). Преимущество такого способа организации хранения изображений заключается в том, что они никогда не потеряются, поскольку находятся внутри исполняемого файла.
Если главное окно создается в Qt Designer , то вы можете использовать визуальные средства, предоставляемые построителем, для вставки изображений в коллекцию.
Примечания
Если вы проживаете в стране, чье законодательство признает патенты на программное обеспечение и где компания Unisys имеет зарегистрированный патент на алгоритм сжатия LZW, то Unisys может потребовать от вас приобрести лицензию на использование GIF. По этой причине, поддержка формата GIF в Qt по-умолчанию запрещена. Мы полагаем, что срок действия этого патента по всему миру истечет к концу 2004 года.
| Пред. | В начало | След. |
| Встроенные виджеты и классы диалогов. | На уровень выше | Создание меню и панелей инструментов. |
MainWindow - Главное окно¶
Используйте готовый объект axipy.app.mainwindow .
Methods:
Добавляет окно просмотра данных.
Добавляет панель в главное окно приложения.
Добавляет слой в текущей карте.
Добавляет слой с запросом на помещение на текущую карту или в новую.
Открывает слой в новой карте.
Читает рабочее пространство из файла.
Возвращает Qt5 объект окна.
Удаляет существующую панель у главного окна приложения.
Сохраняет рабочее пространство в файл.
Создает и показывает главное окно программы.
Показывает окно для локального файла html или если это web страница, запускает браузер по ассоциации
Attributes:
Хранилище объектов приложения.
Корректность состояния главного окна.
Добавляет окно просмотра данных.
view ( View ) – окно просмотра данных.
При создании окон просмотра данных axipy.gui.ViewManager.create_mapview() или axipy.gui.ViewManager.create_tableview() они автоматически добавляются в главное окно программы.
Тип результата
add_dock_widget ( dock_widget , area , icon = None ) ¶
Добавляет панель в главное окно приложения. При успешном добавлении возвращает True. Если же данная панель уже присутствует, то команда игнорируется и возвращается False. Элементы управления, которые требуется разместить на панели, создаются в дополнительном окне, а уже это окно, в свою очередь, устанавливается для панели (см. пример ниже).
- dock_widget ( QDockWidget ) – Пользовательская созданная панель.
- area ( DockWidgetArea ) – Расположение.
- icon ( Optional [ QIcon ]) – Иконка для отображения в списке всех доступных панелей.
from PySide2.QtWidgets import QDockWidget, QWidget, QPushButton from PySide2.QtCore import Qt dock = QDockWidget('Заголовок') widget = QWidget() layout = QVBoxLayout() button = QPushButton("Кнопка") button.clicked.connect(lambda: print('Реакция на кнопку')) layout.addWidget(button) layout.addStretch() widget.setLayout(layout) dock.setWidget(widget) app.mainwindow.add_dock_widget(dock, Qt.RightDockWidgetArea, QIcon('filename.png'))
Тип результата
Добавляет слой в текущей карте.
Добавляет слой с запросом на помещение на текущую карту или в новую.
Открывает слой в новой карте.
Хранилище объектов приложения.
Это то же хранилище, которое отображается в панели «Открытые данные».
При открытии объектов данных axipy.da.ProviderManager.openfile() они автоматически попадают в каталог.
Тип результата
Корректность состояния главного окна.
Читает рабочее пространство из файла.
fileName ( str ) – Наименование входного файла.
Возвращает Qt5 объект окна.
Удаляет существующую панель у главного окна приложения.
Сохраняет рабочее пространство в файл.
fileName ( str ) – Наименование выходного файла.
Создает и показывает главное окно программы.
show_html_url ( url , caption ) ¶
Показывает окно для локального файла html или если это web страница, запускает браузер по ассоциации
- url ( QUrl ) – Ссылка на файл html или адрес страницы.
- caption ( Optional [ str ]) – Заголовок окна
Your access to this site has been limited by the site owner
If you think you have been blocked in error, contact the owner of this site for assistance.
If you are a WordPress user with administrative privileges on this site, please enter your email address in the box below and click "Send". You will then receive an email that helps you regain access.
Block Technical Data
| Block Reason: | Access from your area has been temporarily limited for security reasons. |
|---|---|
| Time: | Mon, 29 Jan 2024 0:23:11 GMT |
About Wordfence
Wordfence is a security plugin installed on over 4 million WordPress sites. The owner of this site is using Wordfence to manage access to their site.
You can also read the documentation to learn about Wordfence's blocking tools, or visit wordfence.com to learn more about Wordfence.
Click here to learn more: Documentation
Generated by Wordfence at Mon, 29 Jan 2024 0:23:11 GMT.
Your computer's time: .