⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 myview.cpp

📁 使用Qt与MySQL C API开发MySQL查询器
💻 CPP
字号:
// MyView.cpp: implementation of the MyView class.
//
//////////////////////////////////////////////////////////////////////
#include <qtoolbar.h>
#include <qtoolbutton.h>
#include <qstatusbar.h>
#include "xpmimage.h"
#include "MyView.h"

//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////


MyView::MyView( QWidget *parent, const char *name)
	//:QVBox( parent, name)
{	
	this->setCaption("MyQuery");
	
	//First Create Frame
	QMenuBar* menu = new QMenuBar( this );			//Menu
	QToolBar* tool=new QToolBar(this,"toolbar");		//ToolBar
	QSplitter* split=new QSplitter( this );			//Main view
	QStatusBar* status=statusBar();			//StatusBar

	split->setOrientation( Vertical );
	setCentralWidget( split );
	
	//insert widget to split
	m_edit=new QGBKEdit(split);
	m_edit->setFont(QFont("Times"));
	m_table=new QTable(2,2,split);
	m_table->setReadOnly(true);
	
	//create pixMap image
	QPixmap pixFileNew( new_xpm );
	QPixmap pixFileOpen( open_xpm );
	QPixmap pixFileSave( save_xpm );

	QPixmap pixExec( exec_xpm );
	QPixmap pixConnect( connect_xpm );
	QPixmap pixDisconn( disconn_xpm );

	split->setOpaqueResize(FALSE);
	
	//create menu
	QPopupMenu *file = new QPopupMenu( this );
	QPopupMenu *menuEdit = new QPopupMenu( this );
	QPopupMenu *query = new QPopupMenu( this );	
	QPopupMenu *help = new QPopupMenu( this );

	file->insertItem( pixFileNew, "&New",m_edit,SLOT(newFile()), CTRL+Key_N );
	file->insertItem( pixFileOpen, "&Open",m_edit,SLOT(openFile()), CTRL+Key_O );
	file->insertItem( pixFileSave,"&Save",m_edit,SLOT(saveFile()), CTRL+Key_S );
	file->insertItem( "Save &As",m_edit,SLOT(saveasFile()));
	file->insertItem( "&Close", m_edit,SLOT(closeFile()));
	file->insertSeparator();
	file->insertItem("Exit",qApp,SLOT(quit()));
	
	menuEdit->insertItem("&Undo",m_edit,SLOT(undo()),CTRL+Key_Z);
	menuEdit->insertItem("&Redo",m_edit,SLOT(redo()),CTRL+Key_Y);
	menuEdit->insertSeparator();
	menuEdit->insertItem("Cu&t",m_edit,SLOT(cut()),CTRL+Key_X);
	menuEdit->insertItem("&Copy",m_edit,SLOT(copy()),CTRL+Key_C);
	menuEdit->insertItem("&Paste",m_edit,SLOT(paste()),CTRL+Key_V);
	menuEdit->insertItem("Clear",m_edit,SLOT(clear()));
	menuEdit->insertSeparator();
	menuEdit->insertItem("Find",m_edit,SLOT(findEdit()));
	menuEdit->insertItem("Replace",m_edit,SLOT(replaceEdit()));
	

	query->insertItem(pixConnect, "&Connect",  this, SLOT(Connect()));
	query->insertItem(pixDisconn, "&DisConnect", this, SLOT(Disconnect()), CTRL+Key_D );
	query->insertItem(pixExec, "Exec",this,SLOT(Exec()),Key_F5);
	
	help->insertItem("About MyQuery",this,SLOT(aboutMe()));
	help->insertItem("About QT",this,SLOT(aboutQT()));

	menu->insertItem( "&File", file );
	menu->insertItem("&Edit",menuEdit);
	menu->insertItem("&Query",query);
	menu->insertItem("&Help",help);
	
	//create toolbar
	QToolButton * tbfileNew
            = new QToolButton( pixFileNew, "New File", "new file",
                               m_edit, SLOT(newFile()), tool, "new file" );
        QToolButton * tbfileOpen
            = new QToolButton( pixFileOpen, "Open File", "open file",
                               m_edit, SLOT(openFile()), tool, "open file" );
	QToolButton * tbfileSave
            = new QToolButton( pixFileSave, "Save File", "save file",
                               m_edit, SLOT(saveFile()), tool, "save file" );
	tool->addSeparator(); 
	QToolButton * tbConnect
            = new QToolButton( pixConnect, "Connect Server", "Connect Server",
                               this, SLOT(Connect()), tool, "Connect Server" );
	QToolButton * tbExec
            = new QToolButton( pixExec, "Execute Script", "Execute Script",
                               this, SLOT(Exec()), tool, "Execute Script" );
	QToolButton * tbDisConnect
            = new QToolButton( pixDisconn, "DisConnect Server", "DisConnect Server",
                               this, SLOT(DisConnect()), tool, "DisConnect Server" );

	//create status
	status->message( "Ready", 2000 );
	//其它
	m_bConnected=false;
	
	mysql=new MYSQL;
	mysql_init(mysql);
}

MyView::~MyView()
{
	delete mysql;
	delete m_edit;
	delete m_table;
}

bool MyView::Connect()
{
	if (m_bConnected){
		int reValue=QMessageBox::warning(this,"MyQuery",
			"Now there is a available connection.\nDo you want disconnect it and connect another?",
			QMessageBox::Yes ,
			QMessageBox::No|QMessageBox::Default);
		if (reValue==QMessageBox::Yes){
			Disconnect();
		}else{
			return true;
		}
	}
	MyConnDlg widget;
	widget.setMySQL(mysql);
	if (widget.exec()!=QDialog::Accepted)
		return false;
	m_bConnected=true;
	return true;
}

bool MyView::Disconnect()
{
	if (!m_bConnected)
		return true;
	mysql_close(mysql);
	m_bConnected=false;
	return true;
}

bool MyView::Exec()
{
	if (!m_bConnected){
		QMessageBox::warning(this,"NO Connected","Now you don't connect to any MySQL server.please try to connect!");
		return false;
	}
	QString sql;
	if (m_edit->hasSelectedText())
		sql=m_edit->selectedText();
	else
		sql=m_edit->text();
	if (sql.isEmpty())
		return false;
	if (mysql_real_query(mysql,sql,(int)sql.length())==0){	
		MYSQL_RES* result=mysql_store_result(mysql);
		showRes(result);
		mysql_free_result(result);
	}else{
		showError();
	}

	return true;
}

void MyView::showRes(MYSQL_RES* res)
{
	initTable();
	if (res==NULL){
		m_table->setNumCols(1);
		m_table->setNumRows(1);
		m_table->setText(0,0,"operation is successful.");
		return;
	}
	int fieldNum=mysql_num_fields(res);
	int rowNum=mysql_num_rows(res);
	QTextCodec *codec = QTextCodec::codecForName("GBK"); 
	m_table->setNumCols(fieldNum);
	m_table->setNumRows(rowNum);
	MYSQL_FIELD* fields=mysql_fetch_fields(res);
	QHeader* header=m_table->horizontalHeader();
	for (int j=0;j<fieldNum;j++){
		header->setLabel(j,codec->toUnicode(fields[j].name));
	}
	MYSQL_ROW row;
	int rowID=0;
	while (row=mysql_fetch_row(res)){
		for (int i=0;i<fieldNum;i++){
			QString value=row[i];
			m_table->setText(rowID,i,codec->toUnicode(value) ?codec->toUnicode( value):"NULL");
		}
		rowID++;
	}
}

void MyView::showError()
{
	initTable();
	m_table->setNumCols(1);
	m_table->setNumRows(1);
	m_table->setText(0,0,(QString)mysql_error(mysql));
}

void MyView::initTable()
{
	assert(m_table);
	m_table->setNumCols(0);
	m_table->setNumRows(0);
}


void MyView::aboutMe()
{
	QString s=QString("This is a query analyzer for MySQL.\nAuthor:SoftMusic\nEmail:mysql_gu@163.net\nVersion: 0.0.3\nCopyRight(C) 2001");
	QMessageBox::about(this,"MyQuery",s); 
}

void MyView::aboutQT()
{
	QMessageBox::aboutQt(this,"MyQuery");
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -