C++ 如何在不同的窗口上设置QWidget的焦点
我在两个不同的QMainWindow上创建了两个QPushButton。我在一个特定的时间间隔内随机分配焦点给他们C++ 如何在不同的窗口上设置QWidget的焦点,c++,qt,qwidget,qtextedit,qmainwindow,C++,Qt,Qwidget,Qtextedit,Qmainwindow,我在两个不同的QMainWindow上创建了两个QPushButton。我在一个特定的时间间隔内随机分配焦点给他们 int main(int argc, char **argv){ QApplication a(argc, argv); QMainWindow *win1= new QMainWindow(); win1->resize(567,578); win1->move(67,30); win1->show(); QMainWindow *win2= new QMa
int main(int argc, char **argv){
QApplication a(argc, argv);
QMainWindow *win1= new QMainWindow();
win1->resize(567,578);
win1->move(67,30);
win1->show();
QMainWindow *win2= new QMainWindow();
win2->resize(567,578);
win2->move(97,580);
win2->show();
win1->show();
//win2->setModal(true);
QPushButton *but1 = new QPushButton(win1);
but1->resize(80,20);
but1->move(100,100);
but1->setText("1");
but1->show();
QPushButton *but2 = new QPushButton(win2);
but2->resize(80,20);
but2->move(100,300);
but2->setText("2");
but2->show();
while(1){
if((rand()%2) == 1){
//win2->lower();
win1->raise();
win1->activateWindow();
win1->setWindowState(Qt::WindowActive);
win1->setFocus(Qt::ActiveWindowFocusReason);
but1->setFocus(Qt::ActiveWindowFocusReason);
}
else{
//win1->lower();
win2->raise();
win2->activateWindow();
win2->setFocus(Qt::ActiveWindowFocusReason);
but2->setFocus(Qt::ActiveWindowFocusReason);
}
qApp->processEvents(0x00);
sleep(2);
}
但问题是,第一个窗口的标题栏没有改变颜色(通常通过视觉堆栈前后放置一个窗口会改变标题栏的颜色),即使它在视觉上已成为顶部窗口,如果您将最后一个循环更改为类似的内容,您将获得所需的行为:
while (1) {
// Exits if both windows are closed
if (!win1->isVisible() && (!win2->isVisible())) {
return 0;
}
// Eventually changes the focus, if the desired window is still visible
if((rand() % 2) == 1) {
if (win1->isVisible()) {
QApplication::setActiveWindow(win1);
}
}
else {
if (win2->isVisible()) {
QApplication::setActiveWindow(win2);
}
}
QTime now;
now.start();
do {
qApp->processEvents(0x00);
} while (now.elapsed() < 2000);
}
while(1){
//如果两个窗口都关闭,则退出
如果(!win1->isVisible()&&(!win2->isVisible()){
返回0;
}
//如果所需窗口仍然可见,则最终更改焦点
如果((rand()%2)==1){
如果(win1->isVisible()){
QApplication::setActiveWindow(win1);
}
}
否则{
如果(win2->isVisible()){
QApplication::setActiveWindow(win2);
}
}
现在开始;
现在,开始();
做{
qApp->processEvents(0x00);
}while(现在.appeased()<2000);
}
无论如何,如果你让你的程序进入睡眠状态,它在这段时间内不会响应用户的输入,所以要小心。
该实现相当难看,但它会检查要聚焦的窗口是否仍然可见(即,用户没有关闭它),如果两个窗口都已关闭,则最终退出。
当然,我想你只对setActiveWindow()感兴趣,所以我没有花太多时间写漂亮的东西 不,它不起作用。标题栏不会改变颜色,因为它应该在这里工作得很好。您使用的是什么版本的Qt,在哪个平台上?当焦点改变时,你有没有试着按下你的反射镜来检查正确的按钮是否有反应?它没有响应吗?你不应该在Qt中使用
sleep
。创建一个插槽并使用QTimer
定期调用此插槽。