• 12962阅读
  • 17回复

[提问]大侠们,如何在对话框标题栏的关闭按钮事件中写入自己的程序???非常着急??? [复制链接]

上一主题 下一主题
离线gjf123
 

只看楼主 倒序阅读 楼主  发表于: 2011-03-16
widget.cpp的全局声明了一个对话框
QDialog *myDlg;
接下去对其设置并显示对话框,想对该对话框标题右上角的关闭按钮事件中写入自己的代码,
比如用户按下关闭按钮时,询问是否保存等信息。
问题:找不到系统的相关函数能将我自己的代码写入。
谢谢各位大侠鼎力相助!
离线xlttap

只看该作者 1楼 发表于: 2011-03-16
自己重新实现closeEvent()就行了。
我简单我快乐
离线gjf123

只看该作者 2楼 发表于: 2011-03-16
在widget.cpp的全局声明了多个对话框
QDialog *myDlg1;
QDialog *myDlg2;
QDialog *myDlg3;

按照一楼的意见,我在widget.h的public下声明void closeEvent(QCloseEvent *event);
在widget.cpp下对这个函数进行实现
void Widget::closeEvent(QCloseEvent *event)
{
。。。
}

程序流程是这样的,

在主界面按下按钮后,通过CONNECT函数使myDlg1->show();
再点标题栏的关闭按钮,程序执行不到这个函数里面
void Widget::closeEvent(QCloseEvent *event)。
不知什么原因,另问QCloseEvent *event 这个参数,怎么传进去,非常感谢,在线等。。。
离线xlttap

只看该作者 3楼 发表于: 2011-03-16
唉。。。你要关闭的是myDlg1,你实现Widget的closeEvent有什么用啊。
你应该实现QDialog的closeEvent。
我简单我快乐
离线gjf123

只看该作者 4楼 发表于: 2011-03-16
xlttap 您好:
非常感谢您的帮助,
但问题如下:
我的工程有四个文件分别是,main.cpp   widget.cpp   widget.h  widget.ui
然后在widget.cpp的全局声明了多个对话框
QDialog *myDlg1;
QDialog *myDlg2;
QDialog *myDlg3;
就是不知道在哪个地方去实现QDialog的closeEvent????

离线xlttap

只看该作者 5楼 发表于: 2011-03-16
唉。。。你子类化一个QDialog,再重写closeEvent就是了。
我简单我快乐
离线gjf123

只看该作者 6楼 发表于: 2011-03-16
widget.cpp 中的代码如下:
#include "widget.h"
#include <QtGui>
#include <sys/msg.h>

QDialog *luboDlg;
QDialog *bakaDlg;
QDialog *deleDlg;

void Widget::on_lubo_Btn_released()
{
        //对话框参数设置
        luboDlg= new QDialog(this);
        luboDlg->setFixedSize(300,180);
        luboDlg->show();
}

然后就不知道在代码的哪个地方去实现QDialog的closeEvent。

您好xlttap,如何子类化QDialog,子类化QDialog代码写在widget.cpp 中吗?非常感谢
离线xlttap

只看该作者 7楼 发表于: 2011-03-16
子类化QDialog都不会? 就是你写一个类,继承了QDialog,这总会吧。
你知道子类化QWidget,却不会子类化QDialog。唉。。。
我简单我快乐
离线gjf123

只看该作者 8楼 发表于: 2011-03-16
谢谢xlttap
已经在widget.h加入如下代码
class myDialog : public QDialog
{
    Q_OBJECT
public:
    void closeEvent(QCloseEvent *event);
};

在widget.cpp中,全局申明
myDialog *settingDlg;

settingDlg= new myDialog(this);
error: no matching function for call to 'gjfDialog::gjfDialog(Widget* const)'
问题出在new myDialog(this)中this,括号中写入this就会导致上述error,但this又必须写上,不知所措了

离线xlttap

只看该作者 9楼 发表于: 2011-03-16
你自己好好看看书吧。唉。。。
看看怎么子类化一个类
我简单我快乐
离线rbllbr

只看该作者 10楼 发表于: 2011-03-16
我将你的问题回复在代码之中了 你可以看下 应该没问题了
附件: daima.zip (508 K) 下载次数:21
离线gjf123

只看该作者 11楼 发表于: 2011-03-16
rbllbr 大侠非常乐于助人,小弟在此感激不尽,什么时候来杭州的话,找我肯定请您吃饭。
使用您的方法之后,真正的实现了closeEvent加入自己的代码。但是新的问题又出来,麻烦您了rbllbr大侠过目
问题如下:
       void mydlg::closeEvent(QCloseEvent *event)
{
    QMessageBox::StandardButton button;
    button = QMessageBox::question(this, tr("退出程序"),
        QString(tr("警告:程序有一个任务正在运行中,是否结束操作退出?")),
        QMessageBox::Yes | QMessageBox::No);
    if (button == QMessageBox::No) {
        event->ignore();  //忽略退出信号,程序继续运行
    }
    else if (button == QMessageBox::Yes) {
        event->accept();  //接受退出信号,程序退出
        、、、、在此添加退出时自己的代码、、、、、、、、
    }
}

widget.cpp内容如下:#include "widget.h"
#include "ui_widget.h"
#include "mydlg1.h"
Widget::Widget(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::Widget)
{
    ui->setupUi(this);
    mydlg1=new MyDlg1(this);
    ui->my_Btn->setDisabled(this);  //此按钮我在widget.ui 拖PushButton的控件生产,并任意写上字体
    mydlg1->show();
}而在mydlg1.cpp的添加退出时自己的代码部分要写一行
ui->my_Btn->setEnabled(this);  //让用户退出对话框时,将widget.ui 上的my_Btn按钮变为使能
改成这样之后,编译出现问题
mydlg1.cpp: error: 'ui' was not declared in this scope

试了很多力所能及的方法,就是搞不定这个错误。。。。麻烦rbllbr大侠给点建议
离线jdwx

只看该作者 12楼 发表于: 2011-03-16
ui->my_Btn->setEnabled(this); 看看帮助,怎么用this?
还是好好看书吧,最起码边看边学。
[ 此帖被jdwx在2011-03-16 21:03重新编辑 ]
发帖时要说明:操作系统、Qt版本、编译器,这样能更快的得到回复。
离线rbllbr

只看该作者 13楼 发表于: 2011-03-17
我的怎么没报错呢 你在下载看看呢
附件: daima.zip (590 K) 下载次数:2
离线gjf123

只看该作者 14楼 发表于: 2011-03-17
rbllbr" data-card-url="pw_ajax.php?action=smallcard&type=showcard&uid=" target="_blank" onclick="return checkUrl(this)" id="url_5">rbllbr 大侠您好:
在mydlg1.cpp中也添加ui->my_Btn->setEnabled(this);
即mydlg1.cpp改为
void MyDlg1::closeEvent(QCloseEvent *event)
{
    //这里面就是你关闭对话框的时候 出现的一些设置 比如弹出某窗口等等
    QMessageBox::StandardButton button;
        button = QMessageBox::question(this, tr("退出程序"),
            QString(tr("警告:程序有一个任务正在运行中,是否结束操作退出?")),
            QMessageBox::Yes | QMessageBox::No);
        if (button == QMessageBox::No) {
            event->ignore();  //忽略退出信号,程序继续运行
        }
        else if (button == QMessageBox::Yes) {
            event->accept();  //接受退出信号,程序退出
            ui->my_Btn->setEnabled(this); //、、、、在此添加退出时自己的代码、、、、、、、、
        }

}

离线gjf123

只看该作者 15楼 发表于: 2011-03-17
ui->my_Btn->setDisabled(this);  ui不知如何全局化;
找了个替代方法:将my_Btn全局化,即widget.ui不用拖控件来绘制,全部代码实现,
extern QPushButton *my_Btn;
这样widget.cpp和mydlg1.cpp都可以调用my_Btn按钮了。

另问:如何禁止通过对话框的标题栏来拖动对话框(即让对话框固定,用户不可移动)
论坛中有个帖子:
http://www.qtcn.org/bbs/read.php?tid=26508
尝试了就是实现不了
rbllbr" data-card-url="pw_ajax.php?action=smallcard&type=showcard&uid=" target="_blank" onclick="return checkUrl(this)" id="url_7">rbllbr 大侠赐教,感激不尽
离线gjf123

只看该作者 16楼 发表于: 2011-03-17
在mydlg1.cpp中添加如下代码
void mydlg::mouseMoveEvent(QMouseEvent *event)
{
        //event->setAccepted(false);
        event->ignore();
}

void mydlg::moveEvent(QMoveEvent *event)
{
        event->ignore();
        //event->setAccepted(false);
}

void mydlg::dragMoveEvent(QDragMoveEvent *event)
{
        event->ignore();
    //event->setAccepted(false);
}

在mydlg1.h中添加声明
public:
    explicit mydlg(QWidget *parent= 0);
    void closeEvent(QCloseEvent *event);
    void mouseMoveEvent(QMouseEvent * event);
    void moveEvent(QMoveEvent *event);
    void dragMoveEvent(QDragMoveEvent *event);

结果:按住对话框标题栏,还是可以拖动
离线rbllbr

只看该作者 17楼 发表于: 2011-03-18
在MyDlg1头文件中声明      void moveEvent(QMoveEvent* pEvent );
然后在cpp中定义这个函数

void MyDlg1::moveEvent(QMoveEvent *pEvent)
{
    this->setGeometry(this->geometry());
    QDialog::moveEvent(pEvent);
}
这样试试 这样拖动的时候会自动复原的原来的位置上
快速回复
限100 字节
 
上一个 下一个