GVKun编程网logo

永远不会调用PyQt的QMainWindow closeEvent(pyqt调用python脚本)

14

对于永远不会调用PyQt的QMainWindowcloseEvent感兴趣的读者,本文将提供您所需要的所有信息,我们将详细讲解pyqt调用python脚本,并且为您提供关于13.QT-QMainWin

对于永远不会调用PyQt的QMainWindow closeEvent感兴趣的读者,本文将提供您所需要的所有信息,我们将详细讲解pyqt调用python脚本,并且为您提供关于13.QT-QMainWindow组件使用、android – 永远不会调用OnInfoListener、c – Qt MainWindow CloseEvent Mac Cmd Q.、c – Qt QMainWindow中央小部件删除的宝贵知识。

本文目录一览:

永远不会调用PyQt的QMainWindow closeEvent(pyqt调用python脚本)

永远不会调用PyQt的QMainWindow closeEvent(pyqt调用python脚本)

我在python中使用pyqt4。
当我关闭QMainWindow窗口时,它不是由closeEvent方法处理的。请有人告诉我这段代码有什么问题:

from PyQt4 import QtCore, QtGuiclass Ui_MainWindow(object):    def setupUi(self, MainWindow):        MainWindow.setObjectName("MainWindow")        MainWindow.resize(277, 244)        self.centralwidget = QtGui.QWidget(MainWindow)        self.centralwidget.setObjectName("centralwidget")        MainWindow.setCentralWidget(self.centralwidget)        self.statusbar = QtGui.QStatusBar(MainWindow)        self.statusbar.setObjectName("statusbar")        MainWindow.setStatusBar(self.statusbar)        QtCore.QMetaObject.connectSlotsByName(MainWindow)    def closeEvent(self,event):        result = QtGui.QMessageBox.question(self,                      "Confirm Exit...",                      "Are you sure you want to exit ?",                      QtGui.QMessageBox.Yes| QtGui.QMessageBox.No)        event.ignore()        if result == QtGui.QMessageBox.Yes:         event.accept()if __name__ == "__main__":    import sys    app = QtGui.QApplication(sys.argv)    MainWindow = QtGui.QMainWindow()    ui = Ui_MainWindow()

答案1

小编典典

closeEvent是一个方法QMainwindow,但你想从你自己使用它Ui_MainWindow的类。尝试以下方法:

from PyQt4 import QtCore, QtGuiclass MainWindow(QtGui.QMainWindow):    def __init__(self, *args, **kwargs):        super(MainWindow, self).__init__(*args, **kwargs)        self.setupUi()    def setupUi(self):        self.setObjectName("MainWindow")        self.resize(277, 244)        self.statusbar = QtGui.QStatusBar()        self.statusbar.setObjectName("statusbar")        self.setStatusBar(self.statusbar)    def closeEvent(self,event):        result = QtGui.QMessageBox.question(self,                      "Confirm Exit...",                      "Are you sure you want to exit ?",                      QtGui.QMessageBox.Yes| QtGui.QMessageBox.No)        event.ignore()        if result == QtGui.QMessageBox.Yes:            event.accept()if __name__ == "__main__":    import sys    app = QtGui.QApplication(sys.argv)    mainWindow = MainWindow()    mainWindow.show()    sys.exit(app.exec_())

如果要保留尽可能多的结构,请尝试以下操作:

from PyQt4 import QtCore, QtGuiclass Ui_MainWindow(object):    def setupUi(self, MainWindow):        MainWindow.setObjectName("MainWindow")        MainWindow.resize(277, 244)        self.centralwidget = QtGui.QWidget(MainWindow)        self.centralwidget.setObjectName("centralwidget")        MainWindow.setCentralWidget(self.centralwidget)        self.statusbar = QtGui.QStatusBar(MainWindow)        self.statusbar.setObjectName("statusbar")        MainWindow.setStatusBar(self.statusbar)        QtCore.QMetaObject.connectSlotsByName(MainWindow)        MainWindow.show()class MyWindow(QtGui.QMainWindow):    def closeEvent(self,event):        result = QtGui.QMessageBox.question(self,                      "Confirm Exit...",                      "Are you sure you want to exit ?",                      QtGui.QMessageBox.Yes| QtGui.QMessageBox.No)        event.ignore()        if result == QtGui.QMessageBox.Yes:            event.accept()if __name__ == "__main__":    import sys    app = QtGui.QApplication(sys.argv)    MainWindow = MyWindow()    ui = Ui_MainWindow()    ui.setupUi(MainWindow)    sys.exit(app.exec_())

13.QT-QMainWindow组件使用

13.QT-QMainWindow组件使用

QMainWindow介绍

  • 主窗口是与用户进行长时间交互的顶层窗口,比如记事本
  • 主窗口通常是应用程序启动后显示的第一个窗口
  • QMainWindow是Qt中主窗口的基类,继承于QWidget,如下图所示:

     

 

QMainWindow和其它类不同,如下图所示:

     

QMainWindow组件布局

       

 

1.菜单栏

QT中提供了预定义的与菜单相关的类组件:

 

创建菜单示例:

QMenuBar  mb= menuBar();                                //返回菜单栏,如果菜单栏没有创建,则返回一个空的菜单栏

QMenu*  menu= new QMenu("File(&F)", QMenuBar );               //(&F):表示添加alt+F键快捷键打开这个菜单

QAction* action= new QAction("New(N)", QMenu);          //(N):表示添加N键快捷键

action-> setShortcut(QKeySequence (Qt::CTRL + Qt::Key_N));  //为菜单项设置快捷键:ctrl+n

menu->addAction(action);                                     //向菜单里添加菜单项"New"

menu->addSeparator();                                       //添加菜单分隔符

mb->addMenu(menu);                                         //向菜单栏里添加菜单File

 

 

2.工具栏

  • 工具栏中的元素可以是各种窗口组件(QAction,Qwidget)
  • 工具栏中的元素通常以图标方式存在,
  • SI软件为例,它的工具栏如下图所示:

 

 

工具栏使用

在Qt中,通过QToolBar类来创建工具栏,然后通过QAction类来创建工具项,如下图所示:

 

 

QToolBar关键成员函数

void setFloatable ( bool floatable );
       //设置工具栏是否可以当做独立的窗口,停靠在上下左右窗口旁,,默认为true

void setMovable(bool movable);
       //设置工具栏是否可以自动移动,停靠在任意处,默认为true

void setIconSize ( const QSize & iconSize );
       //设置工具栏中的每个图标大小

 

创建工具栏示例:

QToolBar *tb = addToolBar("ToolBar");  //将"ToolBar"插入当前工具栏区域,并返回这个QToolBar对象 

 QAction *action = new QAction("",QToolBar);             
 action->setToolTip("Open");                         //信息提示,当鼠标靠近这个项,便会提示信息
 action->setIcon(QIcon(":/res/pic/open.png"));       //设置图标,冒号表示该文件处于资源文件指定的地方    

 tb->addAction(action);   //将工具栏选项加入工具栏

QToolBar中可以加入任意的QWidget组件,比如:文本框(用来查找文字)

示例,在MainWindow类的构造函数里写入:

QToolBar* tb = addToolBar("Tool Bar");

    QAction* action = new QAction("",QToolBar);

    tb->setFloatable(false);
    tb->setMovable(false);

 

    action->setToolTip("Open");
    action->setIcon(QIcon(":/Res/open.png"));

    tb->addAction(action);
    tb->addSeparator();                 //添加间隔符

 

    /*添加QWidget组件*/
    QPushButton* b = new QPushButton("Button");
    QLabel* l = new QLabel("Label",this);
    QLineEdit* e = new QLineEdit(this);

    tb->addWidget(b);
    tb->addWidget(l);
    tb->addWidget(e);

添加Qt资源文件,将open.png加入程序指定的位置处:

 

 

Qt资源文件的作用,就是告诉Qt Creator,该文件处于哪个位置

编译运行:

 

 

3.状态栏

  • 状态栏一般位于主窗口最底部
  • 用来显示简要信息

显示的信息一般分为:

    -时信息,如:  当前程序状态

            -永久信息,如: 程序版本号,机构名称

            -进度信息,如: 进度条提示,百分比提示

在Qt中,通过QStatusBar类来创建状态栏,这个类是个容器类组件,可以包含任意QWidget类,如下图所示:

 

 

常用函数:

QStatusBar *  statusBar ();
//获取当前类的状态栏,如果状态栏没有创建,则返回一个空的状态栏

void  showMessage ( const QString & message, int timeout = 0 ) ;
//在状态栏下左下部显示信息, timeout 的单位是ms,timeout倒计时完会调用clearMessage()

void clearMessage () 
//清除消息

创建状态栏示例:

QStatusBar     *sb = statusBar();

        QLabel*  status1 = new QLabel("Line: 1  Col: 1",this);
        QLabel*  status2 = new QLabel("Lines: 0  Length: 0",this);

        status1->setAlignment(Qt::AlignCenter);                    
        status2->setAlignment(Qt::AlignCenter);

        status1->setMinimumWidth(200);      //设置最小宽度,避免与旁边的信息紧靠在一起
        status2->setMinimumWidth(200);

        sb->addPermanentWidget(status1);
        sb->addPermanentWidget(status2);

效果:

 

 

文本编辑组件

 QT中提供了三种文本编辑组件

  • QLineEdit :单行文本编辑组件
  • QTextEdit:多行富文本编辑组件(类似于word编辑,可以实现图片,个别文字的字体,颜色等编辑)
  • QPlainTextEdit:多行普通文本编辑组件(类似于记事本编辑) 

Qt,在文本编辑组件里自带了右键式菜单

可以实现复制,粘贴,剪切等,以QTextEdit为例:

 

 常用函数

QMenu * QLineEdit::createStandardContextMenu();
                            //获取右击菜单内容
menu->addAction(tr("My Menu Item"));
                            //添加右击菜单内容
addAction(QAction *action, ActionPosition position);
                  //可以在编辑框的开始或者末尾添加一个action,方便我们操作,一个完美的搜索框顿时出现。

 

以QPlainTextEdit组件为例,它的常用信号函数如下:

void textChanged ();
        //每当文档的内容发生变化时,则触发该信号,可以用来判断文本是否被修改,以及输入的字符是什么

void QPlainTextEdit::selectionChanged () ;
        //当文本框鼠标选择改变时,触发该信号

void QPlainTextEdit::cursorPositionChanged ();
        //每当光标的位置发生变化时,触发该信号

void  undoAvailable ( bool available );
        //当用户进行撤销操作时,则触发该信号,如果撤销成功则available 为true

void  redoAvailable ( bool available );
        //当用户进行重做操作时,则触发该信号,如果文本框为空则available 为true

void  blockCountChanged ( int newBlockCount ) 
       //每当按下回车或者删除回车(更新字符块),则newBlockCount计数,并触发该信号, newBlockCount 默认为1

 

 

android – 永远不会调用OnInfoListener

android – 永远不会调用OnInfoListener

我正在尝试收听我创建的媒体播放器的OnInfoListener,以便在缓冲开始和结束时获取.

由于某种原因,事件永远不会发生.

这是我的初始化代码

private void initPlayer(Surface s){
    mPlayer = new MediaPlayer();
    mPlayer.setSurface(s);


    mPlayer.setonCompletionListener(this);
    mPlayer.setonErrorListener(this);
    mPlayer.setonInfoListener(this);
    mPlayer.setonPreparedListener(this);
    mPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);

    try {
        mPlayer.setDataSource(file_url);
        mPlayer.prepare();
    } catch (IllegalArgumentException e) {
        OnError(PLAYER_ERRORS.player_not_loaded,e.getMessage() + "");
    } catch (SecurityException e) {
        OnError(PLAYER_ERRORS.player_not_loaded,e.getMessage() + "");
    } catch (IllegalStateException e) {
        OnError(PLAYER_ERRORS.player_not_loaded,e.getMessage() + "");
    } catch (IOException e) {
        OnError(PLAYER_ERRORS.no_connection,e.getMessage() + "");
    }
}

这是我的倾听者

@Override
public boolean onInfo(MediaPlayer mp,int what,int extra) {


    if(what == MediaPlayer.MEDIA_INFO_BUFFERING_START)
    {
        OnEvent(PLAYER_EVENT.buffering_start);
    }
    else if(what == MediaPlayer.MEDIA_INFO_BUFFERING_END)
    {
        OnEvent(PLAYER_EVENT.buffering_end);
        OnGotDuration(getDuration());
    }

    return what == MediaPlayer.MEDIA_INFO_BUFFERING_START || what == MediaPlayer.MEDIA_INFO_BUFFERING_END;
}

有人可以帮我理解为什么会这样吗?
谢谢

解决方法

显然这是Android中的一个已知错误.
在播放HLS流时,它永远不会调用OnInfoListener或OnBuffering.

查看here了解更多详情

我所谓的解决方案是创建一个现在沿着播放器一侧运行的线程,并不时检查其进度以确定播放是否停止 – 假设这意味着播放器正在缓冲.

这是我想要的代码

private class BufferingThread extends Thread{

    WeakReference<NewDefaultPlayer> player;
    long currentPos,lastSecond;
    boolean isBuffering,alreadyBuffering;
    private Object locker = new Object();

    public BufferingThread(NewDefaultPlayer player) {
        this.player = new WeakReference<NewDefaultPlayer>(player);
    }

    private Runnable BufferStart = new Runnable() {
        public void run() {
            player.get().OnEvent(PLAYER_EVENT.buffering_start);
        }
    };

    private Runnable BufferStop = new Runnable() {
        public void run() {
            player.get().OnEvent(PLAYER_EVENT.buffering_end);
        }
    };

    @Override
    public void run() {
        super.run();

        while(true)
        {
            synchronized (locker) {
                currentPos = player.get().getCurrentPosition();
                isBuffering = currentPos == 0 ? true : currentPos <= lastSecond;
                lastSecond = (int) currentPos;
                if(alreadyBuffering){
                    if(!isBuffering)
                    {
                        if(player.get().getPlayerState().equals(PLAYER_STATES.IS_PLAYING))
                        {
                            alreadyBuffering = isBuffering;
                            TvinciSDK.getMainHandler().post(BufferStop);
                        }
                    }
                } else {
                    if(isBuffering){
                        alreadyBuffering = isBuffering;
                        TvinciSDK.getMainHandler().post(BufferStart);
                    }
                }
                try {
                    sleep(1500);
                } catch (InterruptedException e) {
                    break;
                }
            }
        }

    }
}

//Stop the thread if the user has stopped the video
private void handleBufferingWorkaround(boolean work){
    if(bThread == null)
        bThread = new BufferingThread(this);
    if(work){
        if(!bThread.isAlive())
            bThread.start();
    }
    else if(bThread.isAlive())
    {
        bThread.interrupt();
        bThread = null;
    }
}

希望能帮助到你

c – Qt MainWindow CloseEvent Mac Cmd Q.

c – Qt MainWindow CloseEvent Mac Cmd Q.

在OS X 10.9上使用Qt 5.2和以下应用程序代码
#include "mywindow.h"#include <QApplication>int main(int argc,char *argv[]) {    QApplication a(argc,argv);    MyWindow w();    w.show();    return a.exec(); }

MyWindow从QMainWindow派生并覆盖closeEvent(QCloseEvent *)方法,当我关闭应用程序窗口时调用此方法(例如单击windows(x)关闭按钮),但是当我通过main关闭应用程序时不会调用它菜单 – > “退出”或通过“CMD Q”键快捷键.

通过浏览网页和众多问题,我得到的结论是关闭应用程序应调用所有顶级窗口的closeEvent.这不是这种情况,或者这里出了什么问题?

编辑:除了上面关闭应用程序的方法之外,还有其他我一般应该处理的实例会导致QApplication :: quit而不是调用窗口的close事件吗?例如系统关闭怎么样?

在处理一个关闭事件时,我确认用户确实想要退出,我确保清理就像写回更改的设置一样.我是否应该将清理/保存设置移到析构函数中并在closeEvent中执行确认查询?

解决方法

默认情况下,在Mac上,Qt will create an Apple Menu | Quit if a menubar doesn’t exist with either quit or exit entry.默认创建的条目将调用 QApplication::quit(),这将不会触发您的MyWindow :: closeEvent().

在您的UI中,您应该添加一个名为Exit的菜单项(在Mac上它将自动重命名为Quit),在MyWindow类构造函数中,您应该将该操作连接到close()插槽(从QWidget继承).

更新 – 为了解决您的其他问题,不应该只使用析构函数来释放内存(释放文件锁等).任何可能涉及用户交互的事情(例如提示文件位置或通过QMessageBox警告用户某些事情失败)都需要进入closeEvent方法.保存窗口几何(以及使用QSettings的其他简单项目)也应该通过closeEvent来完成(但是,我已经看到了在析构函数中保存几何的代码,可能会出现一些边缘情况,它会出现意外情况).

c – Qt QMainWindow中央小部件删除

c – Qt QMainWindow中央小部件删除

我的应用程序要求用户在多个屏幕之间切换.我这样做的方法是为每个屏幕创建不同的qframe,然后将qframe设置为MainWindow上的中央小部件.问题是,每次调用setCentralWidget(frame)时,旧框架都会被删除,我以后无法访问它.如何保存旧框架以便以后可以访问它?

如果我的问题不清楚,请告诉我.

解决方法

您可以从QMainWidow中删除中央窗口小部件,重新显示它.然后,你可以设置新的centralWidget;
QWidget* savedWidget = mainWnd->centralWidget();
savedWidget->setParent(0);//Now it is saved
mainWnd->setCentralWidget(newWidget);

同样使用QStackedWidget可能是更好的解决方案.

我们今天的关于永远不会调用PyQt的QMainWindow closeEventpyqt调用python脚本的分享已经告一段落,感谢您的关注,如果您想了解更多关于13.QT-QMainWindow组件使用、android – 永远不会调用OnInfoListener、c – Qt MainWindow CloseEvent Mac Cmd Q.、c – Qt QMainWindow中央小部件删除的相关信息,请在本站查询。

本文标签: