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<QAction*>(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<MSG*>(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);
}