Qt项目中的常见用法

1.QWidget设置为类似如右键菜单
setWindowFlags(Qt::FramelessWindowHint | Qt::Popup | Qt::NoDropShadowWindowHint);

2.QTreeWidget创建parent item刷新问题
ui->treeRoom->resizeColumnToContents(0);
3.
setWindowFlags(Qt::FramelessWindowHint | Qt::Popup | Qt::NoDropShadowWindowHint);
setAttribute(Qt::WA_NoSystemBackground, true);
setAttribute(Qt::WA_TranslucentBackground, true);
setAttribute(Qt::WA_DeleteOnClose);

bool eventFilter(QObject *obj, QEvent *e){
	if(obj == this){
		if(QEvent::WindowDeactivate == e->type()){
			close();
			e->accept();
			return true;
		}
	}
	return QWidget::eventFilter(obj, e);
}

4.QTextCursor insertImage相同图片只显示一个,解决:
QTextImageFormat imageFormat;
imageFormat.setName(imagePath);
this->textCursor().insertImage(imageFormat, QTextFrameFormat::InFlow);
5.设置背景色
QPalette palette = this->palette();
palette.setBrush(QPalette::Background, QBrush(QColor(0, 123, 122)));
this->setPalette(palette);
this->setAutoFillBackground(true);	
paintEvent:
QPainter painter(this);
painter.setBrush(QColor("#1e1e21"));
painter.setPen(Qt::NoPen);
painter.drawRect(this->rect());
6.设置QTextEdit可输入个数:
void MyWidget::slotTextChanged()
{
	if (0 == m_count) {
		return;
	}

	QString curText = this->toPlainText();
	int len = curText.count();
	if (len > m_count) {
		int pos = this->textCursor().position();
		QTextCursor textCursor = this->textCursor();
		curText.remove(pos - (len - m_count), len - m_count);
		this->setText(curText);
		textCursor.setPosition(pos - (len - m_count));
		this->setTextCursor(textCursor);
	}
}
7.QLineEdit设置搜索图标和清除按钮
	searchAction = new QAction(QIcon(qutil::skin("icon_search")), "", this);
	m_lineEdit->addAction(searchAction, QLineEdit::LeadingPosition);
	m_lineEdit->setClearButtonEnabled(true);
	QAction *clearAction = m_lineEdit->findChild(QLatin1String("_q_qlineeditclearaction"));
	if (clearAction) {
		clearAction->setIcon(QIcon(":/xyz");
		connect(clearAction, &QAction::triggered, [this] () {
			emit sigClear();
		});
	}
8.水平线
	QFrame *line = new QFrame(this);
	line->setMaximumSize(QSize(16777215, 1));
	line->setStyleSheet(QStringLiteral("background:rgb(68, 70, 73);"));
	line->setFrameShape(QFrame::HLine);
	line->setFrameShadow(QFrame::Sunken);
9.使用全局热键QxtGlobalShortcut
	if (!m_gsCaptureScreen->setShortcut(QKeySequence(Qt::CTRL + Qt::ALT + Qt::Key_A))) {
		/
	}
10.改变showNormal之后的大小setGeometry
11.无title窗口拉伸(windows环境)
bool MyWindow::nativeEvent(const QByteArray & eventType, void * message, long * result)
{
	Q_UNUSED(eventType);
	if (this->isMaximized()) {
		return false;
	}

	const int HIT_BORDER = 5;
	const MSG *msg=static_cast(message);
	if(msg->message == WM_NCHITTEST) {
		int xPos = ((int)(short)LOWORD(msg->lParam)) - this->frameGeometry().x();
		int yPos = ((int)(short)HIWORD(msg->lParam)) - this->frameGeometry().y();
		if(this->childAt(xPos,yPos) == 0) {
			*result = HTCAPTION;
		} else {
			return false;
		}
		if(xPos > 0 && xPos < HIT_BORDER) {
			*result = HTLEFT;
		}
		if(xPos > (this->width() - HIT_BORDER) && xPos < (this->width() - 0)) {
			*result = HTRIGHT;
		}
		if(yPos > 0 && yPos < HIT_BORDER) {
			*result = HTTOP;
		}
		if(yPos > (this->height() - HIT_BORDER) && yPos < (this->height() - 0)) {
			*result = HTBOTTOM;
		}
		if(xPos > 0 && xPos < HIT_BORDER && yPos > 0 && yPos < HIT_BORDER) {
			*result = HTTOPLEFT;
		}
		if(xPos > (this->width() - HIT_BORDER) && xPos < (this->width() - 0) && yPos > 0 && yPos < HIT_BORDER) {
			*result = HTTOPRIGHT;
		}
		if(xPos > 0 && xPos < HIT_BORDER && yPos > (this->height() - HIT_BORDER) && yPos < (this->height() - 0)) {
			*result = HTBOTTOMLEFT;
		}
		if(xPos > (this->width() - HIT_BORDER) && xPos < (this->width() - 0) && yPos > (this->height() - HIT_BORDER) && yPos < (this->height() - 0)) {
			*result = HTBOTTOMRIGHT;
		}
		return true;
	}
	return false;
}
12.安装全局事件过滤器
class GlobalEventFilter : public QObject
{
	Q_OBJECT
public:
	GlobalEventFilter(QObject *parent);

protected:
	bool eventFilter(QObject *, QEvent *);
};
GlobalEventFilter *globalEventFilter = new GlobalEventFilter(this);
qApp->installEventFilter(globalEventFilter);
13.QTreeWidget遍历
QTreeWidget *myTree;
QTreeWidgetItemIterator iter(myTree);
while (*iter) {
	++iter;
}
14.这里需要特别注意一点,如果QWidget直接show出来,是有背景色的,
但是如果它作为一个父QWidget的子窗口时就没有背景了!此时需要添加如下代码:
	this->setAutoFillBackground(true);
	QPalette palette = this->palette();
	palette.setColor(QPalette::Background, QColor("#36383D"));
	this->setPalette(palette);
15.模态对话框
	QEventLoop eventLoop;
	myWidget->setAttribute(Qt::WA_ShowModal, true);
	myWidget->show();
	connect(myWidget, &QObject::destroyed,  &eventLoop, &QEventLoop::quit, Qt::DirectConnection);
	eventLoop.exec();
16.QTreeWidget删除item
	QTreeWidgetItemIterator iter(ui->treeRoom);
	while (*iter) {
		delete item;
	}
17.窗口抖动
void Shake::start(QWidget *targetWidget, int number, int range)
{
	Q_ASSERT(NULL != targetWidget);
	m_widget = targetWidget;
	m_number = number;
	m_range = range;
	m_start = 0;
	m_point = m_widget->pos();

	m_widget->raise();
	m_widget->activateWindow();
	bool isMaximized = m_widget->isMaximized();
	if (NULL == m_timer)
	{
		m_timer = new QTimer(this);
		QObject::connect(m_timer, &QTimer::timeout, [this, isMaximized] {
			if (m_start < m_number * 4)
			{
				++m_start;
				switch (m_start % 4)
				{
				case 1:
					{
						QPoint newPos(m_point.x(), m_point.y() - m_range);
						m_widget->move(newPos);
					}
					break;

				case 2:
					{
						QPoint newPos(m_point.x() - m_range, m_point.y() - m_range);
						m_widget->move(newPos);
					}
					break;

				case 3:
					{
						QPoint newPos(m_point.x() - m_range, m_point.y());
						m_widget->move(newPos);
					}
					break;

				default:
					m_widget->move(m_point);
					break;
				}
			} else {
				m_timer->stop();
			}
		});
	}
	m_timer->start(40);
}

18.如果刷新有问题可以调用:Widget->style()->polish(this);

19. QComboBox 对齐
 // First : Set the combobox the editable (this allows us to use the lineEdit)
  mComboBox->setEditable(true);
  // Second : Put the lineEdit in read-only mode
  mComboBox->lineEdit()->setReadOnly(true);
  // Third  : Align the lineEdit to right
  mComboBox->lineEdit()->setAlignment(Qt::AlignRight);  
  // Fourth : Align each item in the combo to the right
  for(int i = 0; i < mComboBox->count(); i++)
    mComboBox->setItemData(i, Qt::AlignRight, Qt::TextAlignmentRole);

20.// 去掉输入法输入时的虚线,但是会导致输入法输入框位置不正确
void TextEdit::inputMethodEvent(QInputMethodEvent *e)
{
    if (e->commitString().isEmpty() && !e->preeditString().isEmpty()) {
        return;
    }
    QTextEdit::inputMethodEvent(e);
}


你可能感兴趣的:(qt)