QMessageBox问题

zp_lhy 2016-06-08 09:05:31
在QMessageBox提示框出现的时候,整个界面就无法操作,问:如何在QMessageBox提示框出现时,还能对界面进行操作,不关闭提示框的话
...全文
488 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
zp_lhy 2016-06-15
  • 打赏
  • 举报
回复
已经解决了,只要把QMessage设置为非模态message->setModal(false);然后将需要控制的界面禁止使用就可以了setEnabled(false); 虽然没有用到大家提供的方法,但是以后碰到可以使用呀,感谢大家的帮助!
zp_lhy 2016-06-08
  • 打赏
  • 举报
回复
刚用QMessageBox,然后设置为非模态,就可以了 但是如果要使界面的某快区域在弹出提示框后不能用,但是其他的还可以操作,比如 在弹出提示框后,除了退出程序的标题栏可以使用(如:关闭按钮),但是其他的不能使用,这要怎么限制?
Z_墨脱 2016-06-08
  • 打赏
  • 举报
回复
引用 9 楼 zp_lhy 的回复:
[quote=引用 6 楼 wd350355942 的回复:]
这是我重写的messagebox 如果你想不是模态对话框的话你就继承QWidget就行了 然后那两个确定取消的事件自己重写一下



红色圈里的这些是要自己直接定义吗[/quote]就是这些
Z_墨脱 2016-06-08
  • 打赏
  • 举报
回复
引用 9 楼 zp_lhy 的回复:
[quote=引用 6 楼 wd350355942 的回复:] 这是我重写的messagebox 如果你想不是模态对话框的话你就继承QWidget就行了 然后那两个确定取消的事件自己重写一下
红色圈里的这些是要自己直接定义吗[/quote]界面上直接拖得控件
zp_lhy 2016-06-08
  • 打赏
  • 举报
回复
引用 6 楼 wd350355942 的回复:
这是我重写的messagebox 如果你想不是模态对话框的话你就继承QWidget就行了 然后那两个确定取消的事件自己重写一下



红色圈里的这些是要自己直接定义吗
zp_lhy 2016-06-08
  • 打赏
  • 举报
回复
好的,我先试一下哈,谢了
Little柯南 2016-06-08
  • 打赏
  • 举报
回复
引用 6 楼 wd350355942 的回复:
这是我重写的messagebox 如果你想不是模态对话框的话你就继承QWidget就行了 然后那两个确定取消的事件自己重写一下
嘿嘿,赞一个。继承QWidget让他show出来就可以。这个问题其实也就是模态与非模态的问题
Z_墨脱 2016-06-08
  • 打赏
  • 举报
回复
这是我重写的messagebox 如果你想不是模态对话框的话你就继承QWidget就行了 然后那两个确定取消的事件自己重写一下
Z_墨脱 2016-06-08
  • 打赏
  • 举报
回复
#include "frmMessageBox.h"
#include <QDebug>
frmMessageBox::frmMessageBox(QWidget *parent)
: QDialog(parent)
{
	ui.setupUi(this);
	InitStyle();
}

frmMessageBox::~frmMessageBox()
{

}

void frmMessageBox::mouseMoveEvent(QMouseEvent *e)
{
	if (mousePressed && (e->buttons() && Qt::LeftButton))
	{
		this->move(e->globalPos() - mousePoint);
		e->accept();
	}
}

void frmMessageBox::mousePressEvent(QMouseEvent *e)
{
	if (e->button() == Qt::LeftButton) 
	{
		mousePressed = true;
		mousePoint = e->globalPos() - this->pos();
		e->accept();
	}
}

void frmMessageBox::mouseReleaseEvent(QMouseEvent *)
{
	mousePressed = false;
}

void frmMessageBox::InitStyle()
{
	this->setProperty("Form", true);
	//窗体居中显示
	
	QDesktopWidget *desktopWidget = QApplication::desktop();
	QRect clientRect = desktopWidget->availableGeometry();
	qDebug() << clientRect.width() << clientRect.height();

	QPoint movePoint(clientRect.width() / 2 - this->width() / 2, clientRect.height() / 2 - this->height() / 2);
	this->move(movePoint);

	this->mousePressed = false;
	//设置窗体标题栏隐藏
	this->setWindowFlags(Qt::FramelessWindowHint);
	//设置图形字体
	SetIcon(ui.lab_Ico, QChar(0xf015), 12);
	SetIcon(ui.btnMenu_Close, QChar(0xf00d), 10);
	//关联关闭按钮
	connect(ui.btnMenu_Close, SIGNAL(clicked()), this, SLOT(close()));
	connect(ui.btnCancel, SIGNAL(clicked()), this, SLOT(close()));
}

void frmMessageBox::SetIcon(QLabel *lab, QChar c, int size)
{
	iconFont.setPointSize(size);
	lab->setFont(iconFont);
	qDebug() << c;
	lab->setText(c);
}

void frmMessageBox::SetIcon(QPushButton *btn, QChar c, int size)
{
	iconFont.setPointSize(size);
	btn->setFont(iconFont);
	btn->setText(c);
}

void frmMessageBox::SetMessage(QString msg, int type)
{
	if (type == 0) 
	{
		ui.labIcoMain->setStyleSheet("border-image: url(:/TestStudy/image/info.png);");
		ui.btnCancel->setVisible(false);
		ui.lab_Title->setText(QStringLiteral("提示"));
	}
	else if (type == 1)
	{
		ui.labIcoMain->setStyleSheet("border-image: url(:/TestStudy/image/question.png);");
		ui.lab_Title->setText(QStringLiteral("询问"));
	}
	else if (type == 2) 
	{
		ui.labIcoMain->setStyleSheet("border-image: url(:/TestStudy/image/error.png);");
		ui.btnCancel->setVisible(false);
		ui.lab_Title->setText(QStringLiteral("错误"));
	}

	ui.labInfo->setText(msg);
	this->setWindowTitle(ui.lab_Title->text());
}


void frmMessageBox::on_btnOk_clicked()
{
	done(1);
	//this->close();
	exit(0);
}
Z_墨脱 2016-06-08
  • 打赏
  • 举报
回复
#ifndef FRMMESSAGEBOX_H
#define FRMMESSAGEBOX_H

#include <QDialog>
#include <QMouseEvent>
#include <QPoint>
#include <QDesktopWidget>
#include <QFont>
#include <QLabel>
#include <QPushButton>
#include "ui_frmMessageBox.h"

class frmMessageBox : public QDialog
{
	Q_OBJECT

public:
	frmMessageBox(QWidget *parent = 0);
	~frmMessageBox();

	void SetMessage(QString msg, int type);

protected:
	void mouseMoveEvent(QMouseEvent *e);
	void mousePressEvent(QMouseEvent *e);
	void mouseReleaseEvent(QMouseEvent *);

	void SetIcon(QLabel *lab, QChar c, int size);
	void SetIcon(QPushButton *btn, QChar c, int size);

private slots:
	void on_btnOk_clicked();

private:
	QPoint mousePoint;  //鼠标拖动自定义标题栏时的坐标
	bool mousePressed;  //鼠标是否按下
	void InitStyle();   //初始化无边框窗体
	QFont iconFont;

private:
	Ui::frmMessageBox ui;
};

#endif // FRMMESSAGEBOX_H
zp_lhy 2016-06-08
  • 打赏
  • 举报
回复
有重写的范例没?
zp_lhy 2016-06-08
  • 打赏
  • 举报
回复
重写后就可以对界面的其他控件操作?
Z_墨脱 2016-06-08
  • 打赏
  • 举报
回复
QMessageBox 是模态对话框,你可以自己重写一个QMessageBox 就行了啊

16,234

社区成员

发帖
与我相关
我的任务
社区描述
Qt 是一个跨平台应用程序框架。通过使用 Qt,您可以一次性开发应用程序和用户界面,然后将其部署到多个桌面和嵌入式操作系统,而无需重复编写源代码。
社区管理员
  • Qt
  • 亭台六七座
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧