В начале я хочу извиниться за мой английский. Теперь давайте перейдем к моей проблеме.
Я пытаюсь написать заставку, используя Qt Creator (v5.0.1). Теперь у меня есть окно конфигурации (запущенное приложение с параметром «/ c»), полноэкранное окно (запущенное приложение с параметром «/ s»), и у меня нет окна предварительного просмотра (запущенное приложение с «/ p» и » 1234567 «параметры, где 1234567 — это дескриптор, и он может быть любым числом. У меня проблема с правильным использованием этого дескриптора. Я нашел несколько примеров, но все они не работают. Вот пример:
Создание заставки для Windows. Я пытался скопировать этот код и заставить его работать на моей машине, но было несколько проблем. Некоторые из них я решил, но один я не могу. Вот часть кода:
QApplication app(argc, argv);
QStringList arguments = app.arguments();
/* parse the commandline:
* "[-/][Cc]" or no arguments for configuration mode
* "[-/][Ss]", for fullscreen mode
* "[-/][Pp][ :][0-9]+" for preview mode
*/
Mode mode = ConfigurationMode;
WId parent = 0;
bool OK = arguments.size()<=1;
for(int i=1;i<arguments.size();i++)
{
if(arguments[i].size()<2)
break;
switch(arguments[i][1].toLatin1())
{
case 'c': case 'C':
mode = ConfigurationMode;
OK = true;
break;
case 's': case 'S':
mode = FullScreenMode;
OK = true;
break;
case 'p': case 'P':
if(arguments[i].size()>=4 && arguments[i][2]==':')
parent = (WId)arguments[i].mid(3).toUInt(&OK);
else if(arguments.size()>i)
parent = (WId)arguments[i+1].toUInt(&OK);
mode = PreviewMode;
break;
}
}
И затем вторая часть кода:
ScreenSaverWidget* widget = new ScreenSaverWidget;
widget->setAttribute(Qt::WA_DeleteOnClose);
QObject::connect(widget, SIGNAL(destroyed()), &app, SLOT(quit()));
switch(mode)
{
case ConfigurationMode:
{
QSettings settings("QT", "Screen Saver");
int animationSpeed = settings.value("animationSpeed", 10).toInt();
//animationSpeed = QInputDialog::getInteger(0, "Configure Screen Saver", "Set Animation speed (0-100%)", animationSpeed, 0, 100);
animationSpeed = QInputDialog::getInt(0, "configure Screen Saver", "Set Animation speed (0-100%)",animationSpeed, 0, 100);
settings.setValue("animationSpeed", animationSpeed);
}
return 0;
case FullScreenMode:
new ScreenSaverEventFilter(widget);
widget->showFullScreen();
break;
case PreviewMode:
{
widget->setWindowFlags(Qt::FramelessWindowHint|Qt::SubWindow);
::SetParent(widget->winId(), parent);// <---
RECT parentRect;
::GetClientRect(parent, &parentRect);// <---
widget->move(0,0);
widget->resize(parentRect.right, parentRect.bottom);
widget->show();
}
}
return app.exec();
У меня три ошибки:
неправильное преобразование из ‘WId {aka unsigned int}’ в ‘HWND’ [-fpermissive]
в две строки, которые отмечены во второй части кода.
Есть кто-нибудь, кто знает, как заставить это работать? Есть ли возможность сделать это с Qt? (дескриптор генерируется окном из window.h, и я хочу установить его в качестве родителя виджета Qt, это возможно?)
И еще одна мысль — заставить мою заставку (в режиме предварительного просмотра) реагировать на входные события, например, закрывать событие (из окна «Настройки заставки экрана»), как это сделать?
РЕДАКТИРОВАТЬ 2015.06.14 ————————-
Хорошо, я решил первую проблему, я добавил явное преобразование:
(...)
::SetParent((HWND)widget->winId(), (HWND)parent);// <---
RECT parentRect;
::GetClientRect((HWND)parent, &parentRect);// <---
(...)
но теперь проблема в том, что мое приложение не реагирует ни на какие сигналы из окна «Настройки заставки», например (и это наиболее важно), оно не закрывается, когда должно — когда я выбираю другую заставку или когда я закрываю Окно настроек заставки (я должен убить процесс с помощью диспетчера задач). Есть ли кто-нибудь, кто знает и может написать здесь, как заставить мое приложение принимать сигнал закрытия из окна настроек заставки?
Официальный вызов для установки одного виджета в качестве родительского для другого:
void QWidget :: setParent (QWidget * parent)
Конечно, это необходимо для обеспечения правильной обработки сигнала / слота для такого вложенного виджета и т. Д. Я сам предпочел бы вообще не использовать setParent, а создать родительский виджет QMainWindow с вложенным дочерним виджетом, который принимает весь родительский элемент, используя setCentralWidget позвоните, и тогда вам не нужно делать много ненужных вещей с размером и т. д. Но я не знаю всех деталей в вашей программе.
Устанавливает родительский элемент виджета в родительский и сбрасывает флажки окна. Виджет перемещается в позицию (0, 0) в своем новом родителе.
…
Примечание. Виджет становится невидимым как часть изменения его родителя, даже если он был ранее видимым. Вы должны вызвать show (), чтобы сделать виджет снова видимым.
Что касается изменения размера и оконных флагов. Попробуйте, и если требуется изменение размера, вы, вероятно, можете сделать widget-> resize (parent-> size ()). Что касается флагов, сначала попробуйте без указания их. Есть некоторые сомнения, применима ли эта комбинация к дочернему виджету внутри parent.
В нашем порте приложения для Windows я часто передаю winId () для HWND, и это работает, но помните, что этого можно избежать необходимо Действия с фреймворком Qt и всегда сначала пытайтесь найти правильный путь Qt. Что касается предупреждения компилятора для этого, вы можете использовать reinterpret_cast (widget-> winId ()), если это так.